算法分析—报数退圈问题

12个小朋友手拉手站成一个圆圈,从某一个小朋友开始报数,报到7的那个小朋友退到圈外,然后他的下一位重新报“1”。这样继续下去,直到最后只剩下一个小朋友,求解这个小朋友原来站在什么位置上呢?

#include <stdio.h>

main()

{

    int n,i,k,p,x,m;

    int a[100];

    printf("输入游戏总人数:");

    scanf("%d",&n);

    printf("输入开始报数人的编号:");

    scanf("%d",&k);

    printf("退出圈外人的报数点:");

    scanf("%d",&m);

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

       a[i]=1;  //初始状态表示都在圈内

    p=0;         //p表示退出圈外的人数

    k--;

    printf("在圈中的编号:");

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

       if(a[i]=1)

           printf("i=%d\t",i);

       printf("\n");

    printf("出圈次序:");

    while(p<n-1)

    {

       x=0;

       while(x<m)

       {

           k=k+1;

           if(k>n)

              k=1;

           x=x+a[k];

       }

       printf("%d\t",k);

       a[k]=0;

       p=p+1;

    }

    printf("\n");

}

在实验中开辟了12个元素的数组,开始的时候,把这12个元素的数组都赋值为1,这种状态就表示都是一的时候这个人是在圈内的。小朋友报数就用累加数组元素来模拟,累加到7的时候,这个元素所代表的小朋友就退出到圈外去了,并且把对应的下标状态改成0,这样再累加到该元素时他的和就不会发生改变,从而模拟了已经退出圈外的状态。

发布了18 篇原创文章 · 获赞 16 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/da_ye_zi/article/details/86636415