0
点赞
收藏
分享

微信扫一扫

18 约瑟夫环问题 n个数字,每次从这个圆圈中删除第m个数字,求剩下的最后一个数字


/*
第 18 题:
题目:n 个数字(0,1,…,n-1)形成一个圆圈,从数字 0 开始,
每次从这个圆圈中删除第 m 个数字(第一个为当前数字本身,第二个为当前数字的下一个
数字)。
当一个数字删除后,从被删除数字的下一个继续删除第 m 个数字。
求出在这个圆圈中剩下的最后一个数字。
*/
#include<iostream>
#include<stdio.h>
using namespace std;

int main()
{
int sum,n,m,i,k,a[100];

cin>>n>>m;

printf("原来人为:");
for(i=0;i<n;i++)
printf("%d ",i);
printf("\n依次出去的人为:");

memset(a,0,sizeof(a));
k=0;i=0;sum=n;
//sum是已经出去的人个数
//i用来在整个n中循环
//k递增报数到m,出去一个人
while(sum>0)
{
if(a[i]!=-1)
{
k++;
if(k==m)
{
a[i]=-1;
printf("%d ",i);
k=0;
sum--;
}
}
i++;
if(i>n-1) i=0;
}
return 0;
}

/*
1.第一次移动k个; k%n
2.下一次移动从k+1开始,总数n-1;(f(n-1, m)+k+1)%n
3.k=m-1, f(n,m)=(f(n-1,m)+m)%n. f(1, m) = 0;
*/

#include<iostream>
#include<stdio.h>
using namespace std;

int main()
{
int n,m,fn,i;

cin>>n>>m;
fn=0;
for(i=2;i<=n;i++)
fn=(fn+m)%i;

printf("%d\n",fn);
return 0;
}

举报

相关推荐

0 条评论