经典趣味编程问题
来源:互联网 发布:知乎复制破解 编辑:程序博客网 时间:2024/05/21 10:43
相信很多人在笔试的时候会遇到类似的题目吧,问题是这样描述的:
有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;}
0 0
- 经典趣味编程问题
- 经典趣味数学问题之过河问题
- 经典趣味题:称球问题
- C趣味编程之汉诺塔问题
- C/C++语言经典、实用、趣味程序设计编程百例精解 (10)
- C/C++语言经典实用趣味程序设计编程百例精解(3)
- C/C++语言经典、实用、趣味程序设计编程百例精解 (10)
- C/C++语言经典、实用、趣味程序设计编程百例精解
- C/C++语言经典、实用、趣味程序设计编程百例精解
- C/C++语言经典、实用、趣味程序设计编程百例精解
- C/C++趣味编程经典100例详解
- 趣味编程
- 经典趣味数学题—分油问题的一般性求解
- 趣味程序之古典与经典问题系列
- 趣味问题之趣味数学
- 趣味编程:用LINQ求解八皇后问题
- 趣味编程:用BGL求解八数码问题(A*)
- 趣味编程:用IDA*算法求解八数码问题
- 1、ajax初步
- 【LeetCode】Palindrome Partitioning II
- 项目管理学习笔记六:项目范围管理
- c#常用函数和方法集
- 项目管理学习笔记五:项目整体管理
- 经典趣味编程问题
- 关于windows操作系统之消息和消息队列
- java生成文件并向文件写入内容
- 解决eclipse中overlaps the location of another project: 'xxxx'
- 2014年苹果ios开发者证书申请及xcode5应用上线发布---完整流程
- Hibernate对原生sql处理及结果集和VO的映射
- 用js验证身份证号,真的很准
- 正则表达式基础知识
- Java中的时间格式化和时间计算的方法