3615 - 小丑
有N个人玩游戏选小丑,所以选择了一个方法,所有人按1,2,3.。。。N编号坐在一起。从第一个人开始1,2,3.。M
报数
只要是报到M的,就安全,并离开位置。依次循环报数。直到之剩下一个人。那他就倒霉了。我们所要做的就是
输入N与M,输出安全的人的号数
最后一个就是小丑
Input
第一行输入2个整数N,M,用逗号隔开. N<=100,M<=100;
Output
对于每组测试数据依次输出安全号数。
注意最后不要有空格
Examples
Input
10,3 10,2
Output
3 6 9 2 7 1 8 5 10 4 2 4 6 8 10 3 7 1 9 5
Hint
出题人:刘露
Solution C
#include <stdio.h> #define MAX 105 int main() { int n,m; int len; int data[MAX]; int a,i,x,xx,nn=0; while(scanf("%d,%d",&n,&m)!=EOF) { len=n; for(i=1;i<=n;i++) { data[i]=i; } x=0; xx=0; if(nn) printf("\n"); else nn=1; while(len!=1) { a=0; for(i=1;i<=len;i++) { x++; if(x==m) { if(xx) printf(" "); else xx=1; printf("%d",data[i]); x=0; continue; } data[++a]=data[i]; } len=a; } printf(" %d",data[1]); } return 0; }
Solution C++
#include <bits/stdc++.h> using namespace std; int main() { //freopen("F:\\TestFiles\\test.in","r",stdin); //freopen("F:\\TestFiles\\test2.out","w",stdout); int n,m; while(~scanf("%d,%d",&n,&m)){ int a[105]; memset(a,0,sizeof(a)); int num=0; int i=0,j=0; queue<int> q; while(num<n){ i++; if (a[i]==0){ j++; if (j==m){ a[i]=1; j=j%m; if (i>0) q.push(i); else q.push(n); num++; } } i=i%n; } int kk=0; while(q.size()){ if (kk) printf(" "); else kk=1; printf("%d",q.front()); q.pop(); } printf("\n"); } return 0; }
Hint
出题人:刘露