题目描述:
约瑟夫游戏的主要问题: 输入:总人数 N 剩余人数 K 间隔人数 M 其中的间隔人数为实际间隔的人数,如果剩余人数为0,则输出0。 比如,输入8 4 3(空格分隔输入) 输出1,3,6,7(逗号分隔输出) 输入数据错误时,输出ERROR 分析过程如下: 1、初始状态 1 2 3 4 5 6 7 8 2、间隔三个删除, 4,8 3、余下人数大于4,流程继续删除 5,2 4、现在剩下人数4人=K,剩余输出余下的人有:1,3,6,7
参考代码:
#include<stdio.h>
int a[100001],n,k,m,pos,num,p;
int read(int *x)
{
char c;
c=getchar();
while(c!=' '&&c!='\n')
{
if(c<'0'||c>'9')
{
printf("ERROR\n");
return 1;
}
*x=*x*10+c-'0';
c=getchar();
}
return 0;
}
int main()
{
if(read(&n)) return 0;
if(read(&k)) return 0;
if(read(&m)) return 0;
if(k==0)
{
printf("0\n");
return 0;
}
if(k>n)
{
printf("ERROR\n");
return 0;
}
for(int i=1;i<=n;i++)
{
if(a[i]==0) pos++;
if(pos==m+1)
{
a[i]=1;
pos=0;
num++;
}
if(num+k==n) break;
if(i==n) i=0;
}
for(int i=1;i<=n;i++)
{
if(a[i]==0)
{
if(p==0)
{
printf("%d",i);
p=1;
}
else printf(",%d",i);
}
}
return 0;
}
讲解:
做这一道题时又一次被码图恶心到了。
期末机考要来了,听说考的是码图的题,小伙伴们赶紧刷码图吧!
求实求真,大气大为。