BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #18326同步于 2009/1/5
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

[合集] 问道笔试题

shenlei
2009/1/5镜像同步2 回复
☆─────────────────────────────────────☆ joee ( 混在北邮) 于 (Sun Jan 4 13:34:10 2009) 提到: 100个人围一圈,从第一个开始,数到第10个出圈,然后从后面重新计数,再到第10个出圈,后面依次一直到所有人都出圈 用程序实现,最好有代码 ☆─────────────────────────────────────☆ hg (gyh) 于 (Sun Jan 4 13:44:06 2009) 提到: 不是猴子选大王那道吗? ☆─────────────────────────────────────☆ PtwCJ (鲜的每日C|头像不是我,我是长毛贼~~) 于 (Sun Jan 4 13:45:01 2009) 提到: 最简单最直接的就是直接模拟 【 在 joee ( 混在北邮) 的大作中提到: 】 : 100个人围一圈,从第一个开始,数到第10个出圈,然后从后面重新计数,再到第10个出圈,后面依次一直到所有人都出圈 : 用程序实现,最好有代码 ☆─────────────────────────────────────☆ derkaiser (剑痞忆秋年|MAEMO|Soton) 于 (Sun Jan 4 14:09:04 2009) 提到: 呃。。。。这题。。。 【 在 joee ( 混在北邮) 的大作中提到: 】 : 100个人围一圈,从第一个开始,数到第10个出圈,然后从后面重新计数,再到第10个 : 出圈,后面依次一直到所有人都出圈 : 用程序实现,最好有代码 ☆─────────────────────────────────────☆ hg (gyh) 于 (Sun Jan 4 14:10:14 2009) 提到: 大概这样吧 [QUOTE] #include<stdio.h> #include<stdlib.h> typedef struct list { int num; struct list *nextPtr; } node; int main() { int i; int count = 1; int sum = 0; node *headPtr; node *currentPtr = (node *)malloc(sizeof(node)); node *prePtr; currentPtr->nextPtr = NULL; headPtr = currentPtr; for(i = 1; i <= 100; i++) { currentPtr->num = i; if(i == 100) currentPtr->nextPtr = headPtr; else { currentPtr->nextPtr = (node *)malloc(sizeof(node)); currentPtr = currentPtr->nextPtr; } } while(sum < 100) { if(count == 10) { printf("%d ", headPtr->num); prePtr->nextPtr = headPtr->nextPtr; count = 1; sum++; } else { prePtr = headPtr; count++; } headPtr = headPtr->nextPtr; } system("pause"); return 0; } [/QUOTE] ☆─────────────────────────────────────☆ guo (计忆邮心|郭) 于 (Sun Jan 4 14:47:34 2009) 提到: 这不是约瑟夫环么 随便baidu一下就有一堆。。。 #include <stdio.h> int josefus(int n,int m) { int l=0,c; for(c=1;c<=n;c++) l=(l+m-1)%c+1; return l; } int main() { int n = 100; int m = 10; printf("%d\n", josefus(n, m)); return 0; } ☆─────────────────────────────────────☆ joee ( 混在北邮) 于 (Sun Jan 4 19:21:34 2009) 提到: 【 在 hg 的大作中提到: 】 : 大概这样吧 : [QUOTE] : #include<stdio.h> : ................... [em68] ☆─────────────────────────────────────☆ shenlei (我爱果子|[路]|天山南北|潇湘隐士) 于 (Sun Jan 4 19:40:59 2009) 提到: 约瑟夫问题,随便找本数据结构书就是有的 【 在 joee ( 混在北邮) 的大作中提到: 】 : 100个人围一圈,从第一个开始,数到第10个出圈,然后从后面重新计数,再到第10个出圈,后面依次一直到所有人都出圈 : 用程序实现,最好有代码 ☆─────────────────────────────────────☆ famousz (Fam) 于 (Sun Jan 4 20:19:40 2009) 提到: #include "stdio.h" #include "malloc.h" #include "iostream.h" class CJosephu { private: int * guys; int remain; int total; int m_div; int DoLoop(int PreGuy=0, int PreCount=0) { if(remain==1&&guys[PreGuy]>0) return PreGuy; if(PreGuy==total) DoLoop(0,PreCount); if(guys[PreGuy]==-1) DoLoop(PreGuy+1,PreCount); if(!(++PreCount%m_div)) { guys[PreGuy]=-1; remain--; } DoLoop(PreGuy,PreCount+1); } public: CJosephu(){}; int josephu(int num, int div) { if(num&&div) { remain=total=num; m_div=div; guys=(int*)malloc(num*sizeof(int)); for(int i=0;i<num;i++) guys[i]=i+1; return DoLoop(); } } }; int main() { int num=0,div=0; cout<<"总共几个小孩子?"<<endl; cin>>num; cout<<"数到几的倍数退出?"<<endl; cin>>div; CJosephu j; cout<<"最后剩下的是第"<<j.josephu(num,div)<<endl; getchar(); return 0; } 以做的前面向对象课程的作业 ☆─────────────────────────────────────☆ Evangeline (闇の福音) 于 (Sun Jan 4 20:35:12 2009) 提到: 记得当年数据结构课第一节课的作业就是约瑟夫环。。。 ☆─────────────────────────────────────☆ volCANo (小山|呵呵就叫这个吧『 volcano』) 于 (Sun Jan 4 21:31:10 2009) 提到: 上网查了下算法,重复一遍巩固一下吧 设编号为1, 2, .... n - 1, n, 且k = m % n, 则选出第一个人后由f(n)问题变为f(n - 1)问题,编号变为k + 1, k + 2, ... n, 1 , 2, ... k - 2, k - 1(k被选出) 则选出前后位置对应关系为: x':1 , 2 , ... n - 1, n x :k + 1, k + 2, ... k - 1, (k被选出) 其中x'为f(n)问题的答案,x为f(n - 1)中问题的答案,根据上面的对应关系,x' = (x + k - 1) % m + 1,得到以下递推关系式子: f(1) = 1; f(n) = (f(n - 1) + m - 1) % n + 1; 则求f(n)的程序为: int f(int n, int m){ int l; int i; l = 1; for(i = 2; i <= n; i++) l = (l + m - 1) % m + 1; return l; } 或者(如果设编号是0到n-1) int f(int n, int m){ int l; int i; l = 0; for(i = 2; i <= n; i++) l = (l + m) % m; return l + 1; } 如果直接模拟的话,算法时间复杂度为O(m*n),用以上算法则为O(n) 【 在 joee 的大作中提到: 】 : 100个人围一圈,从第一个开始,数到第10个出圈,然后从后面重新计数,再到第10个出圈,后面依次一直到所有人都出圈 : 用程序实现,最好有代码 ☆─────────────────────────────────────☆ BismarckDD (豫韵悠悠|以仁为本|〖冰雪猪联盟〗|盟众) 于 (Mon Jan 5 01:46:29 2009) 提到: 这不是约瑟夫问题么? 【 在 joee ( 混在北邮) 的大作中提到: 】 : 100个人围一圈,从第一个开始,数到第10个出圈,然后从后面重新计数,再到第10个出圈,后面依次一直到所有人都出圈 : 用程序实现,最好有代码
订阅后,新回复会通过你的通知中心匿名送达。
2 条回复
volCANo机器人#1 · 2009/1/5
代码里有个地方写错了 应该是%i 不是%m 【 在 shenlei (我爱果子|[路]|天山南北|潇湘隐士) 的大作中提到: 】 : ☆─────────────────────────────────────☆ : joee ( 混在北邮) 于 (Sun Jan 4 13:34:10 2009) 提到: : 100个人围一圈,从第一个开始,数到第10个出圈,然后从后面重新计数,再到第10个出圈,后面依次一直到所有人都出圈 : ...................
tsunami机器人#2 · 2009/1/6
up 是的! 应该是%i 【 在 volCANo 的大作中提到: 】 : 代码里有个地方写错了 应该是%i 不是%m