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