相信很多人在笔试的时候会遇到类似的题目吧,问题是这样描述的:
有n个人围成一圈,顺序排号,从第一个人开始报数(从1~3报数),凡报到3的人退出圈子,
问最后留下的人原来排在第几号。
这个题目的思路其实不难,首先第一轮是需要被三整除,标记下报到3的那个人,然后在循环找下一个
报到3的个,记得找到的时候需要重新清下这个,从此人在往下找,依次找到,最后会留下那个没有被标记的数,就算找到了。
有点啰嗦,还是上代码吧
int FindLastNumber(int nums) { int i,isThree, total; int array[nums]; int *pArray = array; for(i=0; i<nums; i++) { *(pArray+i) = i+1;//顺序标号 } i = 0;//循环变量 isThree = 0;//1,2,3计数变量 total = 0;//总数计数变量 while(total<nums-1) { if (*(pArray+i)!=0) { isThree++;//不为3,就继续往下找 } if(isThree == 3) { printf("out number is:%d\n", *(pArray+i)); *(pArray+i) = 0;//标记下被点到的那个数 isThree = 0;//重新计数 total++;//计算下被标记的总数 } i++;//往后移动 if(i==nums) { i = 0;//报到尾部后,需要重新计数 } } while(*pArray == 0) { pArray++;//将最后剩下的那一个数找出来 } printf("the last number is:%d\n", *pArray); return *pArray; }以上为这个题目的基本算法,找出来的是最后剩下的那个,在给出测试程序来验证下:
int main(int argc, char **argv) { int lastOne; int nums; while(1) { printf("Input the numbers of peoples:"); scanf("%d", &nums); if(nums == 0) { printf("the wrong number!\n"); return 0; } lastOne = FindLastNumber(nums); printf("out of queue number is:%d\n", lastOne); } return 0; }
原文地址:http://blog.csdn.net/baiyang20140704/article/details/41745797