一个简单的c游戏

李万鹏 2009-10-10 06:09:58
13个人围成一圈,从第一个人开始顺序报号1,2,3。凡报到3者退出圈子,找出最后留在圈子中的人原来的序号
结果应该是13 可我的程序的结果是11 希望好心人帮改一下
#include <stdio.h>
#include<stdlib.h>
int onlyone(int a[])
{
int i,k = 0;
for(i = 1;i <= 13;i++)
if(a[i] == 0)
k++;
if(k > 1)
return 0;
else if(k ==1)
return 1;
}
int main()
{
int a[13] = {0};
int i = 1,k = 0;
while(!onlyone(a))
{
if(a[i] == 0)
k++;
if(k == 3)
{
a[i] = 1;
k = 0;
}
i++;
if(i == 14)
i = 1;
}
printf("%d",i);
system("pause");
return 0;
}
...全文
266 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
caicai_vxworks 2009-10-13
  • 打赏
  • 举报
回复
这个也是约瑟夫环的问题吧
关于这个的问题还真不少呢
JUSTACY 2009-10-13
  • 打赏
  • 举报
回复
有循环链表就没越界的问题了。
ciniddvon 2009-10-12
  • 打赏
  • 举报
回复
程序算法基本正确,错误两处
1)数组越界 int a[13] = {0}; -》int a[14] = {0};
2)输出的地方有错。
printf("%d",i);修改为
for(i = 1;i <= 13;i++)
if(a[i] == 0)
printf("%d",i);
boyfromhuizhou 2009-10-12
  • 打赏
  • 举报
回复
太烦太烦了 老太婆裹脚布
看看我的程序
#include <iostream.h>
void main(){
int a[13]={0};
int i=0, //第i个人
n=13, //还剩n个人
k=0; //报数
while(n>1)
{
if(a[i]==0)
k++;
if(k==3)
{
k=0;
a[i]=1;
n--;
}
i++;
if(i==13)
i=0;
}
for(int j=0;j<13;j++)
{
if(a[j]==0)
cout<<"最后留在圈子中的人原来的序号是"<<j+1<<endl;
}
}
勤奋的沉沦 2009-10-10
  • 打赏
  • 举报
回复

#include <stdio.h>
#define IF_OUT(flag,offset) ( (((flag) >> (offset)) & 1) )
#define NUM 13
int main()
{
int a[NUM] = {0};
int flag, bflag;
int i = 0,k = 0;
bflag = flag = 0x1FFF;
memset(a, 0x0, sizeof(a));
while(flag)
{
// printf("i = %d\n", i);
if(a[i] == 0) {
k++;
if(k == 3)
{
a[i] = 1;
k = 0;
bflag = flag;
flag ^= (1 << i);
// printf("flag = %4X, bflag = %4X, i = %d", flag, bflag, i);
}
}
i++;
if (i >= NUM) {
i = 0;
}
}
for (i = 0; i < NUM && !IF_OUT(bflag, i); i++);


printf("%d\n", i + 1);
return 0;
}

realOffar 2009-10-10
  • 打赏
  • 举报
回复

/*
13个人围成一圈,从第一个人开始顺序报号1,2,3。凡报到3者退出圈子,找出最后留在圈子中的人原来的序号
结果应该是13 可我的程序的结果是11 希望好心人帮改一下
------------------------

你那个太麻烦了,我给你重新写了一份,如果你用win-tc或vc6得到正确答案的话,请给分:
int findtheone(int cnt);
1、cnt表示有多少人围成一圈
2、圈里的人编号从1顺排
3、返回值为剩下的那个人的编号
*/

#include <stdio.h>
#include <stdlib.h>

int findtheone(int cnt)
{
int c;
int n;
int *a;
int b;
c=cnt;
a=(int*)malloc(sizeof(int)*cnt);
if(a==NULL)return 0;
n=-1;
while(c>1)
{
b=0;
while(1)
{
if(b==0)n+=3;
else n++;
if(n>=cnt)n-=cnt;
if(a[n]!=1)
{
a[n]=1;c--;b=1;
break;
}
}
}
for(n=0;n<cnt;n++)
{
if(a[n]!=1)
{
free(a);
return n+1;
}
}
return 0;
}

int main()
{
int cnt=13;
printf("\nThe one in %d is %d\n",cnt,findtheone(cnt));
system("pause");
return 0;
}
lstok2009 2009-10-10
  • 打赏
  • 举报
回复
for(i = 1;i <= 13;i++)
if(a[i] == 0)
k++; (此处有a[13]出现,所以说数组越界!)
还有个问题:什么时候程序跳出while(!onlyone(a))!应该在只剩下一个人的时候,那此时i
是什么数?它是最后一位退出的人,经过i++后应为9!也就是说最后一位退出的是第八位!最后可以改为:
for(i=1;i<=13;i++)
{
if(a[i]==0)
{printf("%d\n",i);
break;
}
}
aaajj 2009-10-10
  • 打赏
  • 举报
回复
数组越界了,试试看

#include <stdio.h>
#include <stdlib.h>
int onlyone(int a[])
{
int i,k = 0;
for(i = 1;i <= 13;i++)
if(a[i] == 0)
k++;
if(k > 1)
return 0;
else if(k ==1)
return 1;
}
int main()
{
int a[14] = {0}; ///////////////
int i = 1,k = 0;
while(!onlyone(a))
{
if(a[i] == 0)
k++;
if(k == 3)
{
a[i] = 1;
k = 0;
}
i++;
if(i == 14)
i = 1;
}
printf("%d",i);
system("pause");
return 0;
}

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧