约瑟夫环的各种算法

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

基本思想: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;  
            }  
        }  
    }  
}

    原文作者:约瑟夫环问题
    原文地址: https://blog.csdn.net/inconceivableccx/article/details/79183938
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞