洛谷 P1996 约瑟夫问题 题解

原题链接

经典题目来一发

提供两种做法(当然,做法还有很多)

以下两种为基础方法

one

直接模拟

数组01赋值记录状态

#include<bits/stdc++.h>
using namespace std;
int n,m,i,a[150],num;
int main()
{
    cin>>n>>m;
    i=0;
    int j;
    while(num<n)
    for(j=1;j<=n;j++)
        if(a[j]==0)
        {
              i++;
              if(i%m==0) 
           {
            cout<<j<<" ";
            a[j]=1;
            num++;    
           } 
        } 
    return 0;
}

two

数组实现链表

#include<bits/stdc++.h>
using namespace std;
int a[150];
int n,m,i,j,num;
int main()
{   
    cin>>n>>m;
    for(i=1;i<=n-1;i++)
    a[i]=i+1;
    a[n]=1;
    i=1;j=n;
    while(num<n)
    {
        j=a[j];
        i++;
        if(i==m)
        {
            cout<<a[j]<<" ";
            a[j]=a[a[j]];
            num++;
            i=1;
        }
    }
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/zhouzhihao/p/10367195.html