约瑟夫问题
Time Limit: 1 Sec Memory Limit: 128 MB 64bit IO Format: %lld
Description
约瑟夫问题:n个人围成一圈,从第一个人开始报数,数到m的人出圈。再由下一个人开始报数,数到m的人出圈。......
请编写程序输出倒数第k个出圈人的编号。
例如:n=5,m=3,k=1,则应该输出4。
注意:main函数已经给定(如下所示)。
请将程序补充完整。
提交时只需要提交自己补充的代码部分,不需要提交给定的main函数的代码部分。
#include<stdio.h>
int main()
{
int n,m,k,t;
while(scanf("%d%d%d",&n,&m,&k)!=EOF)
{ //n个人排成一圈数数,数到m的人出圈,返回倒数第k个陈泉人的编号
t=f(n,m,k);
printf("%d\n",t);
}
return 0;
}
Input
包含多组测试数据,每组测试数据占一行,每行3个正整数,分别代表n,m和k。k小于等于n,n不超过100。
Output
每组测试数据输出占一行,每行输出倒数第k个出圈人的编号。
Sample Input
5 3 1
Sample Output
4
题目分析:
跟士兵报数类似,要记个数,记循环,总体不算难。
抄代码是会被查重的哦!!!
#include<stdio.h>
int f(int n,int m,int k)
{
//抄代码是有害无益的~
int a[1001],x,p;
int i;
x=n;//剩余人数
for(i=1;i<=n;i++)
a[i]=0;
p=1;
i=1;
while(x>0)
{
if(p==n+1)
p=1;
if(a[p]==0)
{
if(i==m)
{
a[p]=x;
x--;
i=0;
}
i++;
p++;
}
else
p++;
}
for(i=1;i<=n;i++)
if(a[i]==k)
return i;
}
int main()
{
int n,m,k,t;
while(scanf("%d%d%d",&n,&m,&k)!=EOF)
{ //n个人排成一圈数数,数到m的人出圈,返回倒数第k个出圈人的编号
t=f(n,m,k);
printf("%d\n",t);
}
return 0;
}