题目出自谭浩强C语言程序设计第四版
题目是有n个人围成一圈报数,顺序排号,从第一个人开始报数(从1到3),如果报道三则退出,问最后留下来的是原来第几号的那位
思路:首先为n个数设置一个编号,目的是最后结果知道是开始的几号,然后如果要解决围成圈报数的问题,最好的办法就是建立一个变量,使该变量递增,在某些条件下,对该变量进行重置,在while条件下保证他的连续性,这样就可以保证在第一遍循环结束后可以把相应的位数转移到开头
#include<stdio.h>
#include<string.h>
int main(){
int *p,num[40],n,j;
printf("\ninput number is\n");
scanf("%d",&n);
p=num;
for(j=0;j<n;j++){
*(p+j)=j+1;
}
int m=0;; //退出圈子的人数
int k=0; //记录报数
int i=0; //数组的位数
while(m<n-1){ //当出局人数少于该出具人数时
if(*(p+i)!=0){ //当还没出局时
k++; //报数加1
}
if(k==3){ //当报数为三时,出局
k=0; //重置k
*(p+i)=0; //设为0
m++; //推出数加一
}
if(i==n){ //如果指针移到最后一位,就把i重置,重新指向首位
i=0;
}
i++;
}
int lo;
for(lo=0;lo<n;lo++){
if(num[lo]!=0){
printf("%d\n",num[lo]);
}
}
return 0;
}