约瑟夫环的各种算法

基于约瑟夫环,所写出的各种不同类型的代码。

基本思想:1、建立一个长度为n的数组或者链。
2、取出位置编号为(i+1)*m的数显示,将位置编号为(i+1)*m的数置0或者空(i=(i+m-1)%n   i为编号,m为所要出去的数,n为总数)
3、第一轮取完之后的数再组成一个新的数组,用2的办法再取;
4、重复3的操作,最后剩下m-1个数字。

递归型:int fun(int i,int j, int k)    //约瑟夫环
{
if (k == 1)
return (i+j-1)%m;   
else
return (fun(i-1,j,k-1)%m);
}


int main()
{
int i;
for (i = 0;i < 10;i++)
{
printf("第%d次出环:%d\n",fun(10,3,i)
}
return 0;
}

数组型:#include <stdio.h>
#include <string.h>
#define N 100
int main()
 {
 int m;


      int n;


         printf("请输入总人数n \n");


         scanf("%d",&n);


         printf("请输入报的数m \n");


         scanf("%d",&m);


      int a[N] = {0};


      int i;


      int j;


         int k = 0;


      for(i = 0; i < n; i++)


      {


          a[i] = i+1;


      }


      while (n > 1)


      {


          i = (i + m - 1) % n;    //i 为初始化时的号码,m为报的数如3


                k++;


                printf("第%d个出圈的是%d\n",k,a[i]);


          for(j = i+1; j < n; j++)


          {


              a[j-1] = a[j];


          }


          n--;


          if(i == n)


                {


                    i = 0;


          }


      }


      printf("最后剩下的时%d\n", a[i]);


      return 0;


  }


标记型:include<stdio.h>  
#define MAX_VALUE 100 
  
int main()  
{  
    int a[MAX_VALUE] = { 0 };  
  
    int next = 0, cur = 0, flag = 0,change_flag=0;  
    while (1)  
    {  
        int count = 0;  
        if (flag != 0)   
        {  
            cur = next;  
            next++;  
            if (next >= MAX_VALUE)  
            {  
                next = 0;  
            }  
        }  
        else  
        {  
            cur = 0;  
            flag = 1;  
        }  
        while (1)  
        {  
            if (a[next] == 0)  
            {  
                count++;  
                if (count == 3)  
                {  
                    a[next] = 1;  
                    printf("change a[%d] value to 1.\n", next);  
                    change_flag++;  
                    if (change_flag == MAX_VALUE)  
                    {  
                        printf("final value is %d\n",next);  
                        system("pause");
return 0;  
                    }  
                    break;  
                }  
            }  
            next++;  
            if (next == MAX_VALUE)  
            {  
                next = 0;  
            }  
        }  
    }  
}

猜你喜欢

转载自blog.csdn.net/inconceivableccx/article/details/79183938