约瑟夫问题和又遇约瑟夫问题

约瑟夫问题:公式推导 

#include<stdio.h>
int main()
{
    int n, m,i,s=0;
    scanf("%d%d",&n,&m);
    for(i=2;i<=n;i++)
        s=(s+m)%i;
    printf("%d", s+1);
    return 0;
}

又遇约瑟夫

1.

#include<stdio.h>  
int main()  
{  
    int n,m,rest,now;  
    int sign[15]={0};  
    while(~scanf("%d",&n),n)  
    {   
        if(sign[n]==0)  
        {    m=0;  
             while(1)  
             {  m++;  
                now=0;  
                rest=2*n ;  
                while(1)  
                {  
                    now=(now+m-1)%rest+1 ;  
                    if(now>n)  
                    {rest--;now--;}  
                    else break;  
                }  
                if(rest == n)  
                {  
                    sign[n] = m;  
                    break;  
                }  
            }  
        }  
      printf("%d\n",sign[n]);  
    }  
    return 0;  
}

 2.

#include<cstdio>
#include<algorithm>
#include<stack>
#include<queue>
#include<map>
#include<set>
#include<cmath>
#include<vector>
#include<cstring>
#include<string>
#include<iostream>
#include<iomanip>
#define mset(a,b)   memset(a,b,sizeof(a))
using namespace std;
typedef unsigned long long ull;
typedef long long ll;
const int mod=9973;
const int N=100006;
const int inf=0x3f3f3f3f;
//priority_queue<int,vector<int>,greater<int> >q;
int ans[28]={0};
int Joseph[14]={0};
int main()
{
    int k;
    
    while(scanf("%d",&k)&&k!=0)
    {
        if(Joseph[k]!=0)
        {
            printf("%d\n",Joseph[k]);
            continue;
        }
        int n=2*k;
        int m=k+1;
        for(int i=1;i<=k;i++)
        {
            ans[i]=(ans[i-1]+m-1)%(n-i+1);
            if(ans[i]<k)
            {
                m++;
                i=0;
            }
        }
        Joseph[k]=m;
        printf("%d\n",Joseph[k]);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/Kuguotao/article/details/88410000