超过五分钟才写出来,主要是最后怎么实现循环忘了i = (++i)%n。而且和面向对象的思路搞混了



1 //今天新写的 ,有些垃圾 
2 #include <iostream>
3 #include <cstring>
4 using namespace std;
5
6 int vis[100];
7
8 int main()
9 {
10 int i,j,k;
11 int m,n,s=0;
12 cin>>m>>n;
13 memset(vis,0,sizeof(vis));
14
15 int cnt = 0;
16 int temp = 0;
17 int num = 0;
18 for(i=0; i<n; i = (++i)%n)
19 {
20 if(vis[i])
21 continue;
22 cnt++;
23 if(m==cnt)
24 {//在这用一个临时变量保存n的值,每次减一,当n是1的时候输出;不过这时候只能采用第二种输出方式了
25 vis[i] = 1;
26 cnt = 0;
27 }
28 for(j=0; j<n; j++)
29 if(!vis[j])
30 {
31 num++;
32 temp = j;
33 }
34 if(1==num)
35 break;
36 else
37 num=0;
38 if(n==i)
39 i = 0;
40
41 }
42
43 for(i=0; i<n; i++)
44 if(!vis[i])
45 cout<<i<<endl;
46 cout<<temp<<endl;
47 while(1);
48 return 0;
49
50 }



1 #include <iostream>
2 #include <cstring>
3 using namespace std;
4
5 int main()
6 {
7 int i,j,k;
8 int m,n,s=0;
9 cin>>m>>n;
10 for(i=2; i<=n; i++)
11 s=(s+m)%i;
12 int ans = s;
13 cout<<"胜者编号:"<<ans<<endl;//从0开始
14 while(1);
15 return 0;
16 }


 



1 #include<stdio.h>
2 #include<string.h>
3
4 int vis[310];
5
6 void joseph(int n,int m)
7 {
8 int i,j,k;
9 int cnt=0,count=0;
10 memset(vis,0,sizeof(vis));//0表示未选中
11 for(i=1;count<n-1;i=i%n+1)//循环 n-1次
12 {
13 if(vis[i]==0)
14 {
15 // vis[i]=1;
16 cnt++;
17 }
18 if(m==cnt)
19 {
20 vis[i]=1;//出圈
21 cnt=0;
22 count++;
23 }
24 }
25 for(j=1;j<=n;j++)
26 if(vis[j]==0)
27 {
28 printf("%d\n",j);
29 break;
30 }
31 }
32
33 int main()
34 {
35
36 int m,n;
37 while(scanf("%d%d",&n,&m),n||m)
38 joseph(n,m);
39 return 0;
40 }