超过五分钟才写出来,主要是最后怎么实现循环忘了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 }