1073 约瑟夫环

1073 约瑟夫环

基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题
收藏
关注
N个人坐成一个圆环(编号为1 - N),从第1个人开始报数,数到K的人出列,后面的人重新从1开始报数。问最后剩下的人的编号。
例如:N = 3,K = 2。2号先出列,然后是1号,最后剩下的是3号。
Input
2个数N和K,表示N个人,数到K出列。(2 <= N, K <= 10^6)
Output
最后剩下的人的编号
Input示例
3 2
Output示例
3

对于约瑟夫问题,比较传统的算法一般效率不高.

 1 // #include <bits/stdc++.h>
 2 // #define N 1000005
 3 // using namespace std;
 4 // int people[N];
 5 // int k[N];
 6 // int main(){
 7 //   int n,m;
 8 //   scanf("%d%d",&n,&m);
 9 //    int step=1;
10 //    int index=0;
11 //    int count=0;
12 //    int ans;
13 //    while(count!=n){
14 //      if(step==m){
15 //        count++;
16 //        step=0;
17 //        people[index]=1;
18 //        ans=index+1;
19 //      }
20 //      index=++index%n;
21 //      if(people[index]==0){
22 //        step++;
23 //      }
24 //    }
25 //    printf("%d
", ans);
26 //   return 0;
27 // }
28 
29 #include <bits/stdc++.h>
30 using namespace std;
31 int main(){
32   int n,m;
33   scanf("%d%d",&n,&m);
34   int result=0;//当n=1时的情况
35   for(int i=2;i<=n;i++){
36     result=(result+m)%i;
37   }
38   printf("%d
",result+1);
39   return 0;
40 }
原文地址:https://www.cnblogs.com/zllwxm123/p/7390082.html