• C语言 约瑟夫圈问题:N个人围成一圈,从第一个人开始按顺序报数并编号1,2,3,……N,然后开始从第一个人转圈报数,凡是报到3的退出圈子。则剩下的最后一个人编号是多少。


    样例输入3  输出2

    输入100   输出91

    代码及分析:

    #include<stdio.h>
    int main()
    {
      int i,n,N,out,a[1000];
      out=i=n=0;            //用out记录退出圈子的人,初始化0;
      printf("输入约瑟夫圈大小");
      scanf("%d",&N);
      for(i=0;i<N;i++)         //用N个数的数组保持N个人,并讲该数组全部初始化1,用以记录第N-1个人在圈外还是圈内(1则圈内,0则圈外);
      {
        a[i]=1;

      }
      i=0;
      while(out!=N-1)          //利用while循环找到剩下的人的编号;直到出圈的人=N-1时候停止;
      {
        if(a[i]==1)           //由于a[i]=1表示在圈内,则只要有a[i]==1,并令n++,记录下他报的数;
        {  

          n++;

        }
        if(n==3)            //由于报到3即出圈,后继续从1开始报;由于只要报到n=3,则该人即出圈,则用out++来记录出圈的人数;并且将该人所在a[i]从1                      改为0,表示该人已经出圈,下一次循环时该人不参与报数;
        {
        a[i]=0;n=0;out++;
        }
        i++;
        if(i==N)             //由于N个人围成了一个圈,则如果报到了第N个人,则下一个人为编号1,则赋值i=0;继续下一次查找;
        {

          i=0;

        }
       }
      for(i=0;i<N;i++)           //由于出圈的人都已经被重新赋值0;则只要找到a[i]=1的人,则该人为剩下的人;  
      if(a[i]==1)
      {  

        printf("最后剩下的是第%d个人",i+1);break;

      }

    return 0;
    }

    我在努力,虽然依旧很菜。
  • 相关阅读:
    lazyload【思路】
    图片旋转
    模拟滚动条【大体功能实现】
    Firefox window.close()的使用注意事项
    修改KindEditor的CSS文件
    ownerDocument property
    网易新闻图片展示效果
    关于td不支持position问题
    strcat strncat
    Tcl_FindExecutable
  • 原文地址:https://www.cnblogs.com/icyhusky/p/4166302.html
Copyright © 2020-2023  润新知