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

题目描述:

报数:有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);//归还 清除内存;
}

 

  • 23
    点赞
  • 79
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值