30个人(编号为0~29)围成一圈,从第0号开始报数1,凡报到n(n为输入数据,n>=1)的人离开圈子,后面的人再从1开始报数,照此进行下去,最后留下的为原来第几号?要求用一维数组实现算法,输出最后留下的1个人的数组下标。
#include "stdio.h"
int main()
{ int a[30]={1},m,n,i,r;
scanf("%d",&m);
for(n=30,r=0;n!=1;)
{for(i=0;i29) r=r-30;
if(a[r]!=0) i++;}
a[r-1]=0; n=n-1; }
for(r=0;a[r]!=0;r++);
printf("%d",r);
}
大佬指教一下 我写的哪里有问题吗
1条回答 默认 最新
关注让阿豪来帮你解答,本回答参考chatgpt3.5编写提供,如果还有疑问可以评论或留言
你的代码中存在一些问题,我来帮你指出并改正:- 在初始化数组a时应该为a[30] = {0};,表示30个人都还在圈子里。
- 在for循环中n应该初始化为29,而不是30,因为初始情况下有30个人在圈子里。
- 在内层的for循环中,应该把r++的操作放在if的外面,以确保每次循环都要进行r++操作。
- 最后寻找留下的那个人时,应该是a[r]为1的时候,而不是a[r]不为0。因为数组a中标记的是第i个人是否离开圈子,为0表示离开了,为1表示还在圈子里。
- 最后输出的时候应该是r+1,因为数组下标是从0开始的。 综上所述,修改后的代码如下:
#include "stdio.h" int main() { int a[30] = {0}, m, n, i, r; scanf("%d", &m); n = 29; for(r = 0; n != 1;) { for(i = 0; i < m; r++) { if (r >= 30) r -= 30; if (a[r] == 0) i++; } a[r-1] = 1; n--; } for(r = 0; a[r] != 1; r++); printf("%d", r + 1); return 0; }希望这个改进后的代码能够帮助你解决问题。如果还有其他疑问,欢迎继续提问。
解决 无用评论 打赏 举报