第18题:
题目:n个数字(0,1,…,n-1)形成一个圆圈,从数字0开始,
每次从这个圆圈中删除第m个数字(第一个为当前数字本身,第二个为当前数字的下一个数字)。
当一个数字删除后,从被删除数字的下一个继续删除第m个数字。
题目:n个数字(0,1,…,n-1)形成一个圆圈,从数字0开始,
每次从这个圆圈中删除第m个数字(第一个为当前数字本身,第二个为当前数字的下一个数字)。
当一个数字删除后,从被删除数字的下一个继续删除第m个数字。
求出在这个圆圈中剩下的最后一个数字。
#include<iostream>
using namespace std;
int joseph(int n,int m)
{
int *help = new int[n];
for(int i=0;i<n;i++)
help[i]=i;
int j=0; //j为全局变量,指示当前访问位置
for(int i=n;i>1;i--) //从约瑟夫环中删除n-1个数
{
int k=m; //每次都删除第k个数
while(1) //while循环找到第k个数的位置
{
if(help[j]!=-1)
k--;
if(k==0)
break;
j=(j+1)%n; //形成环
}
help[j]=-1; //删除找到的这个数,即标记为-1
}
for(int i=0;i<n;i++)
if(help[i]!=-1)
{
int t=help[i];
delete []help;
return t;
}
}
int joseph1(int n,int m)
{
int fn=0;
for(int i=2;i<=n;i++)
fn=(fn+m)%i;
return fn;
}
int main()
{
cout<<joseph(10,79)<<endl;
cout<<joseph1(10,79)<<endl;
}