Josephus问题(模拟)

来源:互联网 发布:centos 任务管理器 编辑:程序博客网 时间:2024/06/05 22:08

题目:约瑟夫问题,输入小孩人数num和每数到第m个小孩离开,问最后一个小孩是原序列第几个?

数据范围:num,m<=10000;


思路:有两种方法,第一种按题意直接模拟(时间复杂度较大),第二种通过倒推出通项,在此不赘述;


代码(一):

#include <bits/stdc++.h>using namespace std;const int maxn=10000;int num,m;int a[maxn]; int main(){while(cin>>num>>m){for(int i=0;i<num;i++)    a[i]=i+1;int k=1,i=-1;//k代表第k个小孩的离开 while(1){for(int j=0;j<m;){i=(i+1)%num;if(a[i]!=0)   j++;//核心操作 }if(k==num)    break;a[i]=0;//标识小孩离开 k++; }cout<<a[i]<<endl; }return 0;}

代码(二):

#include <bits/stdc++.h>using namespace std;int num,m,r;int main(){while(cin>>num>>m){for(int k=1;k<=num;k++)            r=(r+m)%k;cout<<r+1<<endl; }return 0;}




原创粉丝点击