|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
感谢大佬指教
题目如下,设有n个人围成一圈,从编号为m的人开始由1开始报数,每次报到数k的人退出游戏,后面的人从1开始报数,求最后剩下的人的编号。
我的想法是每次数到k的人标记为0,下次报数的人为0是直接跳过去,最后输出数组,数值不为0的元素,就是剩下那个人的编号,但是我的程序运行的结果每次都是我初始的m值,求大佬帮忙看看
- #include<stdio.h>
- #define N 100
- int main()
- {
- int a[N],n,m,k,i,index;
- int step =1;//计步器
- int count = 0;//退出的人数
- printf("输入一个数令它为总人数n\n"); //队列中的人数
- scanf("%d",&n);
- printf("输入一个数令它为初始编号m\n"); //从编号为m的人开始数
- scanf("%d",&m);
- printf("输入一个数令它为数到k时退出\n"); //数到k的人退出
- scanf("%d",&k);
- index=(m-1); //a[index]为编号m的值
- for(i=0;i<n;i++)
- {
- a[i]=i+1;
- }
- while(count<(n-1)) //循环条件,退出的人数为count
- {
- step++;
- index=(++index)%n;
-
- if(step=k)
- {
- a[index]=0;
- step=0;
- count++;
- }
- while(a[index]=0)
- {
- index++;
- }
-
- }
-
- for(i=0;i<n;i++)
- {
- a[i];
- printf("%2d",a[i]); //打印此时数组里所有的数值,剩下不为0的编号为最后一个剩下的
- }
-
- printf("\n共退出%d人\n",count);
-
- return 0;
- }
复制代码
#include<stdio.h>
#define N 100
int main()
{
int a[N],n,m,k,i,index;
int step =1;//计步器
int count = 0;//退出的人数
printf("输入一个数令它为总人数n\n"); //队列中的人数
scanf("%d",&n);
printf("输入一个数令它为初始编号m\n"); //从编号为m的人开始数
scanf("%d",&m);
printf("输入一个数令它为数到k时退出\n"); //数到k的人退出
scanf("%d",&k);
index=(m-1); //a[index]为编号m的值
for(i=0;i<n;i++)
{
a[i]=i+1;
}
while(count<(n-1)) //循环条件,退出的人数为count
{
step++;
index=(++index)%n;
if(step==k)
{
a[index]=0;
step=0;
count++;
}
while(a[index+1]==0 && a[index]==0)//要考虑当数组中连续为0时,要跳过值为零的那一个元素
{
index++;
index=index%n;
}
}
for(i=0;i<n;i++)
{
a[i];
printf("%2d",a[i]); //打印此时数组里所有的数值,剩下不为0的编号为最后一个剩下的
}
printf("\n共退出%d人\n",count);
return 0;
}
|
|