C语言新手求助!!!急!!!

C语言新手求助!!!急!!!,第1张

分类: 电脑/网络 >> 程序设计 >> 其他编程语言

问题描述:

10个人围成一圈,编号依次从1到10.从编号为1的人开始从1到3报数,凡报数是3的人退出圈子.编写程序输出依次出列的人的编号.(用选择,循环语句以及数组知识编写)

解析:

新手当然要照顾了 所以一个代码一个代码的给你加注释。。

看明白了最好自己在做一边

这题有很多做法 给你一个最好理解的例子吧 但是这个代码的效率。。。。。

代码如下:

#include <stdioh>/头文件/

#define M 10 /宏定义 可直接改变圈的大小/

#define N 3 /可定义 从1数到 几 退出这个圈子/

void main()/主函数/

{

int a[M];/定义数组/

int i;/用做循环等/

int x = 1; /数到几/

int y = 0;/最近M次循环里有多少个人已经出去这个圈/

int k = 1;/while的开关变量/

for(i=0; i<M; i++)/给数组赋值/

{

a[i] = i+1;

}

while(k)

{

for(i=0; i<M; i++)/M个为一组按照下标过滤/

{

if(a[i] == 0)/判断这个a[i]位置上的人是否已经出圈/

{

y++;/如果出圈变量加一/

continue;/退出本次循环/

}

if(x == N)/a[i]上的人没有出圈 而且正好数到N/

{

printf("%d ",a[i]);/显示这个人的编号/

a[i] = 0;/用0代替 代表已经出圈/

x = 1;/数 数重新从1 开始/

}

else/a[i]上的人没有出圈 但还没有数到N/

{

x++;/继续数下一个数/

}

}

if(y == M)/如果M个为一组全都已经出圈 代表圈里已经没有人了/

{

k = 0;/退出while循环程序结束/

}

else/圈里还有人/

{

y = 0;/把y置0待下次for循环时重新计数/

}

}

printf("\n");/可有可无/

getch();/可有可无/

}

结果为

3 6 9 2 7 1 8 5 10 4

你可以更改程序中的M N的数字来改变要求。

多做做题有好处 ,祝你快点进步。!

由于百度对对齐的处理非常差 所以你可以到这里看代码

bababian/photozoomslpictureid=B16AE5B1739602D1F2A716DB4EA83D52DT&size=6&viewID=DB4A5B6DABA0DD07C8135UR

如果看不清 请右键 另存后在看 。

百度 老岩 gabmyd@126

经典的约瑟夫环问题

设n个人围成一圈,标号为0n-1,从第一个人开始依次从1到k循环报数,当报到k的

时候此人出圈。设J(n,

k,

i)表示第i个出圈的人的标号。

定理一:

J(n,

k,

1)

=

(k-1)

MOD

n,

(n>=1,

k>=1)

…………

(1)

证明:由定义直接得证。

定理二:

J(n+1,

k,

i+1)

=

(k

+

J(n,

k,

i))

MOD

(n+1),

(n>=1,

k>=1,

1<=i<=n)

………

(2)

证明:

设g

=

J(n,

k,

i),因此如果有n个人,从0开始报号,第i个出圈的标号为g。现在考

虑J(n+1,

k,

i+1),因为J(n+1,

k,

1)

=

(k-1)

MOD

(n+1),即第一步的时候删除数

字(k-1)

MOD

(n+1),第二步的时候从数字k开始数起。因而问题变为了找到剩下的n

个数字中从k开始数起被删除的第i个数字(注意这时(k-1)

MOD

(n+1)已经被删除了)

,而这恰好就是(g+k)

MOD

(n+1),(2)成立。

根据(2),很容易求得n个数里面第i个出圈的数。

就根据这个定理递推计算吧!

比较完整的

#include<Windowsh>

#include<stringh>

#include<iostream>

using namespace std;

struct PERSON

{

int flag;

int num;

PERSON pNext;

};

int g_iCount=0;

void ArrayEatMouse(int a[],int count,int num)

{

int iLoop=0;

int ExitNum=0;

int iCount=0;

while(ExitNum<count-1)

{

if(0==a[iLoop])

{

Sleep(100);

iCount++;

if(iCount==num)

{

a[iLoop]=1;

cout<<"第 "<<iLoop+1<<" 出圈!"<<endl;

iCount=0;

ExitNum++;

}

}

iLoop++;

if(iLoop==count)

iLoop=0;

}

}

PERSON ListEatMouse(PERSON pHead,int count,int num)

{

PERSON pCur=pHead;

PERSON pPre;

int ExitNum=0;

int iCount=0;

if(NULL==pCur)

{

cout<<"List Is NULL"<<endl;

return NULL;

}

bool bIsOut=false;

while(ExitNum<count-1)

{

Sleep(100);

iCount++;

if(iCount==num)

{

bIsOut=true;

pPre->pNext=pCur->pNext;

cout<<pCur->num<<"出圈!"<<endl;

delete pCur;

pCur = pPre->pNext;

iCount=0;

ExitNum++;

if(NULL==pCur)

{

pCur=pHead;

continue;

}

}

if(!bIsOut)

{

pPre = pCur;

pCur=pCur->pNext;

if(NULL==pCur)

pCur=pHead;

}

else

{

bIsOut=false;

continue;

}

}

//返回最后的胜出的节点指针!

return pPre;

}

PERSON CreatList()

{

PERSON pHead=NULL;

PERSON pCur;

PERSON pPre;

pCur=new PERSON;

cin>>pCur->num;

pCur->flag=0;

while(pCur->num!=0)

{

if(NULL==pHead)

{

pHead=pCur;

pCur->pNext=NULL;

}

else

{

pPre->pNext=pCur;

}

g_iCount++;

pPre=pCur;

pCur=new PERSON;

cin>>pCur->num;

pCur->flag=0;

}

delete pCur;

pCur = NULL;

pPre->pNext=NULL;

return pHead;

}

int main()

{

PERSON pHead=NULL;

PERSON pNewHead;

cout<<"参加游戏的人员:"<<endl;

pHead = CreatList();

PERSON pTemp=pHead;

int num;

cout<<"计数最大值!"<<endl;

cin>>num;

cout<<"开始游戏!"<<endl;

pNewHead=ListEatMouse(pHead,g_iCount,num);

if(pNewHead!=NULL)

{

cout<<"第 "<<pNewHead->num<<"个人胜出!"<<endl;

}

//释放胜出节点!

delete pNewHead;

pNewHead = NULL;

return 0;

}

你问的是约瑟夫问题 。

我之前用Java语言实现过,用eclipse 软件直接可以实现

package joseph;

public class joseph {

public static void main(String[] args) {

Creatlist creatlist=new Creatlist();

creatlistget_n(17);

creatlistlinklist();

creatlistshowlink();

creatlistget_k(2);

creatlistget_m(3);

creatlistplay();

}

}

class node

{

int num;

node nextnode=null;

public node(int num)

{

thisnum=num;

}

}

class Creatlist

{

int n=0;

public void get_n(int n)

{

thisn=n;

}

node firstnode=null,temp=null;

int i=0;

public void linklist()

{

for(i=1;i<=n;i++)

{

if(i==1)

{

node node1=new node(i);

firstnode=node1;

temp=node1;

}else if(i!=n)

{

node node2=new node(i);

tempnextnode=node2;

temp=node2;

}else

{

node node3=new node(i);

tempnextnode=node3;

temp=node3;

tempnextnode=firstnode;

}

}

}

public void showlink()

{

node temp=firstnode;

do

{

Systemoutprintln(tempnum);

temp=tempnextnode;

}while(temp!=firstnode);

}

int k;

public void get_k(int k)

{

thisk=k;

}

int m;

public void get_m(int m)

{

thism=m;

Systemoutprintln("每"+thism+"个删除一个节点");

}

public void play()

{ //关于i 全局变量or局部变量

int i,j;

node temp1=null;

node temp=firstnode;

temp1=firstnode;

for(i=1;i<=k-1;i++)

{

temp1=tempnextnode;

temp=tempnextnode;

}

Systemoutprintln("从第"+tempnum+"个节点开始");

//Systemoutprintln("从第"+temp1num+"个节点开始");

while(n!=1)

{

for(j=1;j<m;j++)

{

temp=tempnextnode;

}

for(j=1;j<m-1;j++)

{

temp1=temp1nextnode;

}

Systemoutprintln("delete num is"+tempnum);

temp1nextnode=tempnextnode;

temp=tempnextnode;

temp1=temp1nextnode;

n--;

}

Systemoutprintln("最后一根独苗是"+tempnum);

}

}

/我对你的题目理解是这样,你看有没有错:

首先,13个人围成一圈,1-2-3报数,报到3的就退出圈外,下轮报数时他就不能报了。还有报到最后剩一个人的时候就停止,输出剩下那个人的号数。程序如下:可以通过改Num的值来改变人数/

#include<stdioh>

#define Num 13

struct man //每个同学拥有学号和报的数两个信息

{ int no;

int shu;

}man[Num];

void main()

{

int i,j,k,N=Num,lun=0,c=0;

for(j=0;j<Num;j++)

{

man[j]shu=0;

man[j]no=j+1;

}

while((Num-N)<(Num-2))

{

lun++;

N=0;

for(i=0;i<Num;i++)

{

if(man[i]shu!=3)

{

c++;

man[i]shu=c;

N++;

}

if(c==3)

c=0;

}

printf("第%d轮:\n",lun);

for(k=0;k<Num;k++) //每报一轮 输出一下整体报数情况

printf("%d %d\n",man[k]no,man[k]shu);

}

printf("最后胜出的是:\n");

for(k=0;k<Num;k++)

{

if(man[k]shu!=3)

printf("%d号\n",man[k]no);

}

}

以上就是关于C语言新手求助!!!急!!!全部的内容,包括:C语言新手求助!!!急!!!、有N个人围成一环形圈,第一个人从1开始报数,报道M的人出列,直到最后一个同学,请写出算法。、约瑟夫问题:n个人围成一圈,从第1个人开始数数,数到3的人出圈,输出出圈人的顺序。等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zz/9779944.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-01
下一篇 2023-05-01

发表评论

登录后才能评论

评论列表(0条)

保存