c语言josephus问题程序设计,C语言编程Josephus问题

C语言编程Josephus问题

來源:互聯網  2010-05-28 14:19:55  評論

分類: 電腦/網絡 >> 程序設計 >> 其他編程語言

問題描述:

Josephus问题是说,一群小孩围成一圈,任意假定一个数m,从第一个小孩起,顺时针方向数,每数到第m个小孩时,该小孩便离开。小孩不断离开,圈子不断缩小。最后,剩下的一个小孩便是胜利者。究竟胜利者是第几个小孩呢?程序要求输入小孩的个数以及数m的值,输出最后获胜的小孩的编号。(用数组实现)

參考答案:

/*这个答案我不是已经给过了吗?

好象被删掉了,再给你发一次吧,补充一下,应作者要求,在这里解释一下代码的意思,我晕死.*/

#include

#include

#define max 1024

void findout(int n,int m)//这函数的作用是找出最后剩下的小孩

{

int buf[max];//max上面有定义,为1024,大小你看实际需要改

int dex=0;

int in=0;

for(int i=1;i<=n;i++)//n是小孩的个数

{

buf[i]=i;//给小孩赋号码,第几个小孩,号码就为几

}

while(n>in+1)//剩下小孩个数大于1的时候才执行

{

for(i=1;i<=n;i++)//遍历所以小孩

{

if(buf[i]!=0)//小孩号码不为0的时候

{

dex++;

if(dex==m)//若是数到m,

{

buf[i]=0;//则把小孩号码改成0

in++;//被排除的小孩个数加1

dex=0;//判断值清0,从新开始找

}

}

}

}//while.退出的时候只剩下一个小孩

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

if(buf[i]!=0)

printf("最后的小孩号码为:%d\n",buf[i]);//打印小孩的号码

}

void main()//这个函数够简单吧,这个自己看,我累死了

{

int n,m;

char c='y';

printf("#############测试开始了#############\n");

printf("\n");

while(c=='y')

{

printf("请输入小孩的个数:");

scanf("%d",&n);

printf("请输入m的值?:");

scanf("%d",&m);

if((n>0)&&(m>0))

{

findout(n,m);

}

else

{

printf("输入有误\n");

}

printf("继续吗?y or n\n");

getchar();

c=getchar();

}

printf("\n");

printf("#############测试结束了############\n");

}

[b]分类:[/b] 电脑/网络 >> 程序设计 >> 其他编程语言[br][b]问题描述:[/b][br]Josephus问题是说,一群小孩围成一圈,任意假定一个数m,从第一个小孩起,顺时针方向数,每数到第m个小孩时,该小孩便离开。小孩不断离开,圈子不断缩小。最后,剩下的一个小孩便是胜利者。究竟胜利者是第几个小孩呢?程序要求输入小孩的个数以及数m的值,输出最后获胜的小孩的编号。(用数组实现)[br][b]参考答案:[/b][br]/*这个答案我不是已经给过了吗?

好象被删掉了,再给你发一次吧,补充一下,应作者要求,在这里解释一下代码的意思,我晕死.*/

#include

#include

#define max 1024

void findout(int n,int m)//这函数的作用是找出最后剩下的小孩

{

int buf[max];//max上面有定义,为1024,大小你看实际需要改

int dex=0;

int in=0;

for(int i=1;i<=n;i++)//n是小孩的个数

{

buf[i]=i;//给小孩赋号码,第几个小孩,号码就为几

}

while(n>in+1)//剩下小孩个数大于1的时候才执行

{

for(i=1;i<=n;i++)//遍历所以小孩

{

if(buf[i]!=0)//小孩号码不为0的时候

{

dex++;

if(dex==m)//若是数到m,

{

buf[i]=0;//则把小孩号码改成0

in++;//被排除的小孩个数加1

dex=0;//判断值清0,从新开始找

}

}

}

}//while.退出的时候只剩下一个小孩

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

if(buf[i]!=0)

printf("最后的小孩号码为:%d\n",buf[i]);//打印小孩的号码

}

void main()//这个函数够简单吧,这个自己看,我累死了

{

int n,m;

char c='y';

printf("#############测试开始了#############\n");

printf("\n");

while(c=='y')

{

printf("请输入小孩的个数:");

scanf("%d",&n);

printf("请输入m的值?:");

scanf("%d",&m);

if((n>0)&&(m>0))

{

findout(n,m);

}

else

{

printf("输入有误\n");

}

printf("继续吗?y or n\n");

getchar();

c=getchar();

}

printf("\n");

printf("#############测试结束了############\n");

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值