约瑟夫问题41个人围成一圈由第一个人开始数到第三个就死一直循环找出不死的人能编出来吗网上看不懂
答案:3 悬赏:10
解决时间 2021-02-16 08:50
- 提问者网友:容嬷嬷拿针来
- 2021-02-16 05:52
约瑟夫问题41个人围成一圈由第一个人开始数到第三个就死一直循环找出不死的人能编出来吗网上看不懂
最佳答案
- 二级知识专家网友:妄饮晩冬酒
- 2021-02-16 07:18
void writeto(link_stu H)
{
FILE *a;
link_stu p;
p=H->next;
a=fopen("stu.dat","w+");
fwrite(H,sizeof(lnode_stu),1,a);
while(p!=NULL)
{
fwrite(p,sizeof(lnode_stu),1,a);
p=p->next;
{
FILE *a;
link_stu p;
p=H->next;
a=fopen("stu.dat","w+");
fwrite(H,sizeof(lnode_stu),1,a);
while(p!=NULL)
{
fwrite(p,sizeof(lnode_stu),1,a);
p=p->next;
全部回答
- 1楼网友:十年萤火照君眠
- 2021-02-16 08:46
我觉得用指针做最方便,做成首位相连的链表,算法基本没难度。
不过还是用数组写吧,你可以照着这个写一个java的。
int i,j;
int total =41; //总人数
j=0;
int a[total];
for(i=0;i<41;i++){a[i]=1;}//数组a初始化,1表示活着。。。
i=0;
j=1;
for(;;) //循环开始
{
if(a[i]==1){ //只有这个人活着我们才会去判断是不是数到3了,如果死了,就应该跳过
if(j==3){//到这个人时j数到3了
a[i]=0;//置0,杀掉他
total--; //活着的人少了一个
j=1;//j重新开始计数
if(i==40){i=0;}else(i++;)//如果我们数到第41个位置了要回头
}else{
j++;//如果j没到3,我们也要往下数,但是j要加1
if(i==40){i=0;}else(i++;) //同上
}
}else{ //已经死了(0),那就往下一个,但是j是不动的,因为这个位置已经空了
if(i==40){i=0;}else(i++;)//同上
}
if(total==1) break; //剩一个人就停止
}
for(i=0;i<41;i++)
{
if(a[i]!=0)
printf("%d\n",i); //1就是还是活着的,i是他的编号
}
}
不过还是用数组写吧,你可以照着这个写一个java的。
int i,j;
int total =41; //总人数
j=0;
int a[total];
for(i=0;i<41;i++){a[i]=1;}//数组a初始化,1表示活着。。。
i=0;
j=1;
for(;;) //循环开始
{
if(a[i]==1){ //只有这个人活着我们才会去判断是不是数到3了,如果死了,就应该跳过
if(j==3){//到这个人时j数到3了
a[i]=0;//置0,杀掉他
total--; //活着的人少了一个
j=1;//j重新开始计数
if(i==40){i=0;}else(i++;)//如果我们数到第41个位置了要回头
}else{
j++;//如果j没到3,我们也要往下数,但是j要加1
if(i==40){i=0;}else(i++;) //同上
}
}else{ //已经死了(0),那就往下一个,但是j是不动的,因为这个位置已经空了
if(i==40){i=0;}else(i++;)//同上
}
if(total==1) break; //剩一个人就停止
}
for(i=0;i<41;i++)
{
if(a[i]!=0)
printf("%d\n",i); //1就是还是活着的,i是他的编号
}
}
- 2楼网友:躲不过心动
- 2021-02-16 08:22
#include "stdio.h"
int f(int *p,int n)
{
int count=n,t=0,i,r;
while(count>1)
{
count=0;
for(i=1; i<=n; i++)
{
if(*(p+i)!=0)
{
t++;
if(t==3)
{
*(p+i)=0;
t=0;
}
else
{
count++;
}
}
}
}
for(i=1; i<=n; i++)
{if(*(p+i)!=0)
{r=*(p+i);}
}
return r;
}
void main()
{
int n=41,i,a[20],r;
for(i=1; i<=41; i++)
{
a[i]=i;
}
r=f(a,n);
printf("最后剩下的是原来第%d号的那位.",r);
}
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯
• 手机登qq时,显示手机磁盘不足,清理后重新登 |
• 刺客的套装怎么选啊? |