问题:有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。
为什么我这个代码运行不出结果呀?
#include
using namespace std;
int main()
{
int n;//最开始的总人数
int i;//控制变量
cout<<"请输入有多少人参加游戏"<<'\n';
cin>>n;
int s[100];//定义一个数组
int j=0;//总共退圈人数
int y;// 每轮退圈人的号码
int cout=0;//每轮报号累加数
for(i=0;i1;//1在圈内,0在圈外,所有人都在圈外时停止循环
}
while(jfor(i=0;iif(s[i]==1)
{
cout++;
if(cout%3==0)
{
s[i]=0;
j++;
y=i+1;
}
}
}
}
cout<'\n';
return 0;
}
我实在没理解的逻辑。我写了一个,带有详细注释,供您参考。如果有用望采纳。
#include <stdio.h>
int main() {
int m, n;
scanf("%d %d", &n, &m); // n人数,m是报数
if (m <= 0 || n <= 0) {
printf("输入数据不合法\n");
return -1;
}
int a[n + 1];
for (int i = 1; i < n; i++)
a[i] = i + 1;
a[n] = 1;
int pos = 1; // 表示最先从编号为1的人开始数,pos表示当前数到的人的序号
int cnt = 1; // 表示当前数到第几个,因为第一个已数过,故cnt=1
while (a[pos] != pos) { // a[pos]!=pos 说明下一个不是自己本身,即人数>=2个,游戏继续
cnt++; // 数的人加1,即将序号为a[pos]的人已经数过
if (cnt == m) { // 当cnt=n时,说明该人要出圈
a[pos] = a[a[pos]]; //将pos位的直接后继(a[pos]) 改为 a[pos]位的直接后继(a[a[pos]])
pos = a[pos]; //继续向后数,当前数到的是序号为更新后的a[pos]的,cnt计数为1
cnt = 1;
} else {
pos = a[pos]; //如何不是第n个,继续往后数,将pos向后移动
}
}
printf("最终留下%d号\n", pos);
return 0;
}
1.while(j<n)和for(i=0;i<n;i++)功能重复了,它俩不能嵌套使用
2.内层应该是个while循环,以保证当数到尾的时候能够从头开始数
3.if(cout%3==0)在执行之后,应该跳出内层循环,以保证踢人动作只会执行n-1次
4.j<n应该改为j<n-1,否则一共n个人踢出去n个人,都踢出去了