C语言指针实现循环报数问题(简单约瑟夫环问题)

来源:互联网 发布:医保网络业务申请表 编辑:程序博客网 时间:2024/06/15 05:22

题目描述:

报数:有n个人围成一圈,按照顺序从1到n编好号。从第一个人开始报数,报到x(x>1)的人退出圈子,下一个人从1开始重新报数,报到x的人退出圈子。如此下去,直到留下最后一个人。问留下来的人的编号。试编写相应程序。

分析:利用指针的赋0后的特性解决

赋0,即空指针,就是不指向任何对象,相当于NULL地址为0的地址是不允许读写的,这是操作系统的保护机制,所以约定用地址0代表该指针不能使用,定义宏NULL为0,最新语言标准似乎专门定义了一个nullptr取代宏NULL,

源代码:

#include <stdio.h>
#include <stdlib.h>
int main(void)
{
   int i,n;
  printf("请输入参加报数的人数:");
   scanf("%d",&n);//利用数组与指针之间的关系改变地址,

  printf("x:"); 
   scanf("%d",&x);
   int p[n];
   for(i=0;i<n;i++)
      p[i]=i+1;

   int k=1;
   int m=0;
   
    while(m<n-1)
      for(i=0;i<n;i++)
      {
         if(*(p+i)!=0)
          {
             if(k==x)
             {
                *(p+i)=0;//将退出的人标记为0   
                m++;//退出人数加1 
                k=0;
             }
            k++;
          }
       }
     // *(p+i)=k;//循环一轮,指向第一个(可有可无)
 for(i=0;i<n;i++)//找出地址非0的那个指针即所找的那个编号
    if(*(p+i)!=0)
       printf("%d\n",i+1);
  
 return 0;
 free(p);//归还 清除内存;
}


1 0