1047 - C语言程序设计教程(第三版)课后习题10.5
时间限制:1秒
内存限制:128兆
题目描述
有n人围成一圈,顺序排号。从第1个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来的第几号的那位。
输入
初始人数n
输出
最后一人的初始编号
样例输入
3
样例输出
2
一个简单的约瑟夫环问题,有专门的公式可以直接出答案,
但是我并不会(不好意思的笑了),所以我在写这道题的时
候用的是模拟的方法,比较麻烦但是应该可以看懂,思路是
把数组下标看作是第几个人,里面存自己报的数,如果报的
数为3,则数组赋值为0,代表淘汰 ;
#include<stdio.h>
#include<string.h>
int main()
{
int a[1005], n, b=1, m, j=1, v, x;
scanf("%d",&m);
memset(a,1,sizeof(a)); //数组初始化为1,代表全部没有淘汰
c=m;
while(c!=1)
{
c=0; //c代表总人数,如果人数剩余为1,则输出
for(int k=1;k<=m;k++)
{
if(a[k]!=0) //如果不为0,则代表没有淘汰,继续报数
{
a[k]=b; //b代表报的数是多少
b++;
c++;
v=k; //记下没被淘汰人的下标,方便输出
}
if(a[k]==3) //如果报的数为三则淘汰
{
a[k]=0;
b=1; //b归为1,从新开始报数
}
}
}
printf("%d\n",v); //输出剩余那个人的标号
return 0;
}