N 人报数,最后只剩一人问题
来源:互联网 发布:淘宝怎么设置客服 编辑:程序博客网 时间:2024/05/22 10:50
/*** 现有N个人绕着一个足够大的园桌按顺时针坐成一圈, 每个人都有一个编号,编号从0开始,* 从0号的人开始按顺时针报数,报的数从1开始, 凡是报的数字是7的倍数,或数字中有7, 这个人就从桌子上离开,* 按顺时针方向后面的人继续进行报数.依此进行下去,最终桌上会剩下的最后一个人,问最后剩下的这个人的编号是几?* 请编写一个C程序解决.如果用C++语言, 你又如何解决?***/#include "timer.h"#include <stdio.h>#include <string>#include <cstddef>#include <assert.h>#include <iostream>#include <exception>#include <stdexcept>class Element{public: unsigned long _data; Element* _pre; Element* _next; Element() : _pre ( NULL ), _next ( NULL ), _data ( 0 ) {}};Element* CreatCircularList ( unsigned long N );bool DeleteElementList ( Element *p );/** N 个数,数到的数是base的整数倍,或是此数里含有base,就移除*/// 为了降低难度,此处假设base 是7, pHead 是包含 N个元素的循环链表void Detect7 ( Element* pHead, unsigned long base );//判断num中是否存在 7, true, existbool CheckSeven ( unsigned long num );Element* gRelease = NULL;int main ( int argc, char **argv ){ unsigned long N; printf ( "How long do you want? please enter a positive number: " ); scanf ( "%d", &N ); gRelease = new Element; assert ( gRelease ); Element* pHead = CreatCircularList ( N ); assert ( pHead ); // init the list for ( int i = 0; i != N ; ++i ) { pHead->_data = i; pHead = pHead->_next; } TimeStart(); Detect7 ( pHead, 7 ); TimeStop(); printf ( "process time is : %f us \n", GetElapsedTime() ); DeleteElementList ( gRelease );#ifdef _WIN32 system ( "pause" );#endif}Element* CreatCircularList ( unsigned long N ){ assert ( N > 0 ); TimeStart(); Element *head = new Element; assert ( head != NULL ); Element *cur = NULL; cur = head; try { for ( unsigned long i = 0; i != N - 1; ++i ) { // Element * temp = new Element; assert ( temp != NULL ); temp->_pre = cur; // temp point to previous cur->_next = temp; // previous point to temp cur = cur->_next; } cur->_next = head; // circular linked list head->_pre = cur; } catch ( const std::bad_alloc& err ) { printf ( "%s \n", err.what() ); return NULL; } TimeStop(); printf ( "Allocate memory time is : %f us \n", GetElapsedTime() ); return head;}// release Element Listbool DeleteElementList ( Element *p ){ assert ( p != NULL ); Element * rel = p; // int num = 0; while ( rel->_next ) { Element * temp = rel; rel = rel->_next; delete temp; //++num; } delete rel; // printf ( "内存释放 %d 次\n", num ); return true;}void Detect7 ( Element* pHead, unsigned long base ){ assert ( pHead > 0 ); assert ( base > 0 ); Element* pRelease = gRelease; Element* pCurrent = pHead; for ( unsigned long i = 1;; ++i ) { if ( i == -1 ) { printf ( "over flow \n" ); return; } if ( pCurrent->_data == pCurrent->_next->_data ) {//判断是否是最后一个元素 printf ( "The last member is %d \n", pCurrent->_data ); //for release pRelease->_next = pCurrent; pRelease = pRelease->_next; pRelease->_next = NULL; return; } if ( i % 7 == 0 ) { //判断是否是7 的倍数 pCurrent->_pre->_next = pCurrent->_next; pCurrent->_next->_pre = pCurrent->_pre; //for release pRelease->_next = pCurrent; pRelease = pRelease->_next; pCurrent = pCurrent->_next; continue; } if ( CheckSeven ( i ) ) { //判断是否包含7 pCurrent->_pre->_next = pCurrent->_next; pCurrent->_next->_pre = pCurrent->_pre; //for release pRelease->_next = pCurrent; pRelease = pRelease->_next; pCurrent = pCurrent->_next; continue; } pCurrent = pCurrent->_next; } return;}//判断num中是否存在 7, true, existbool CheckSeven ( unsigned long num ){ if ( num <= 0 ) return false; unsigned long ret = num; unsigned long remainder = 0; remainder = ret % 10; //求个位上的数字是几 if ( remainder == 7 ) return true; else CheckSeven ( num / 10 );}
#include "timer.h"i64 time_start ;i64 time_stop ;i64 time_freq ;void TimeStart(){#if _WIN32 QueryPerformanceFrequency ( ( LARGE_INTEGER * ) &time_freq ); QueryPerformanceCounter ( ( LARGE_INTEGER * ) &time_start );#elif __linux__ time_freq = 1000; struct timeval s; gettimeofday ( &s, 0 ); time_start = ( i64 ) s.tv_sec * 1000 + ( i64 ) s.tv_usec / 1000;#endif}void TimeStop(){#if _WIN32 QueryPerformanceCounter ( ( LARGE_INTEGER * ) &time_stop );#elif __linux__ struct timeval s; gettimeofday ( &s, 0 ); time_stop = ( i64 ) s.tv_sec * 1000 + ( i64 ) s.tv_usec / 1000;#endif time_stop -= time_start;}double GetElapsedTime(){ // unit: us return ( double ) time_stop * 1000000 / ( double ) time_freq;}
0 0
- N 人报数,最后只剩一人问题
- 报数问题:m人报n
- 1,2报数最后剩下的人的问题
- n个人报数退出问题,数到m退出,最后剩下的是几号
- C:m围圈报数,报到n的人出列,循环报数,求最后剩的那个人
- 约瑟夫环问题:有n个人围成一圈,顺序编号。从第1个人开始报数(从1-m报数),凡报到m的人退出圈子,问最后留下的是原来第几号的那位?
- n人站圈报数,3 出列。 最后留下的人原来的位置 3种方式
- n人围圈,报数为3退出,问最后一人的编号?
- 报数出队,输入n与m,找到最后一个人
- n个人围成一圈报数问题
- n个人围一圈报数问题
- n个人循环报数1-3问题
- n个人循环报数1-3问题
- 多人报数问题
- 约瑟夫问题的解决(有n个人围成一圈,顺序排号,从第一个开始报数(从1到3报数),凡报到3的人退出圈子,问最后最后留下的是原来第几号的那位.)
- 经典的报数退出问题,以前叫猴子选大王。n个人排成一圈报数,报到3的退出,循环直至最后一个,问,最后一个的原来号码是多少。
- C:n人站成一圈,报数到m的人离开队伍,求最后剩下的是第几人
- 报数游戏 有n个孩子站成一圈,从第一个孩子开始顺时针方向报数,报到3的人出列,下一个人继续从1报数, 直到最后剩下一个孩子为止。问剩下第几个孩子。
- 给程序员推荐的书籍
- codevs1068 乌龟棋(DP)
- Java并发框架Executor学习笔记
- 高圆圆赵又廷北京办回门宴 何炅谢娜道贺
- Android-布局管理 (五大布局控件使用)
- N 人报数,最后只剩一人问题
- yii中accessRules的使用
- 获取array最后一个key
- 增加控件及注册绑定控件!
- 微信公众开发PHP各类菜单点击事件回应
- 第14周项目5-体会棋盘游戏中的数据存储
- 网络图形标准
- Sort Colors,Search in Rotated Sorted Array I,II,Merge Intervals,Insert Interval,Subsets II
- 关于window8安装应用出现2503