多人围成一圈报数问题

题目出自谭浩强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; 
}

点赞