欢迎来到天天文库
浏览记录
ID:39564982
大小:17.50 KB
页数:4页
时间:2019-07-06
《华为2014校园招聘机考第二题》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、//zsl//华为2014校园招聘第二道上机题//杀人环问题//总共n人排成一个圆环,按圆环顺序每次数到第m个人就杀掉,最后剩下谁?//2013-09-14//Thisisastupidmethodtosolvethisproblem.//#include#include#include#defineMAX_NUM100//最多能处理的人数是100,其实可以定的更大,随自己更改。#defineALIVE'1'#defineDEAD'0'#defineDISPLAY1//要求的完成的函
2、数//入口参数:n-->总共的人数//m-->每次数到第m个人就杀掉//返回值:最后活着的人的编号//intsurvive(intn,intm){intkilledpos;//杀掉某些人之后剩余的人开始/结束的编号intlastcount;//上一次杀人的位置intnext1;//下一个活着的人的位置intcountkilled;//统计杀掉的人数,,它最大值为n-1;intcount0tom;inti,j;//设置用来显示杀人步骤的变量#ifDISPLAYintk;#endif////构造一个字符串描述杀人环的生死状态//活着的人-->1
3、,死的人-->2charpeople[MAX_NUM]="";//Initialcountkilled=0;for(i=1;i<=n+1;i++){people[i]=ALIVE;}//beginkillingkilledpos=0;do{//开始一轮循环,杀掉一个人for(count0tom=0,i=killedpos,j=i+1;;){//每次数数开始都现计算出下一个活着的人的位置//并从这个位置开始数数for(j=i+1;;j++){//如果下一个位置指向了最后一个人的下一位,就从头开始数起if(j==n+1){j=1;}if(peo
4、ple[j]==ALIVE){next1=j;break;}}i=next1;//开始数数了if(people[i]=ALIVE){count0tom++;//如果数到了m,则杀掉这个人,//死掉的人数增加一个//并且跳过开始下一轮数数if(count0tom==m){people[i]=DEAD;count0tom=0;killedpos=i;countkilled++;//显示这一次谁被干掉了#ifDISPLAYprintf("第%d次判生死:",countkilled);for(k=1;k<=n;k++){if(people[
5、k]==ALIVE)//活着的人{printf("%d",k);}else{if(k==killedpos){printf("$%d$",k);//刚刚被杀的人}elseprintf("_%d_",k);//之前被杀的人}}printf("----------------------------------------------");#endif//显示完毕//如果死了n-1个,则跳出杀人数数if(countkilled==n-1){//break;//找到活着的人的位置for(j=1;j<=n&&people[j]==DEAD;
6、j++){}returnj;}}}}}while(countkilled<=n-1);//找到活着的那个人的位置//for(j=1;j<=n&&people[j]==DEAD;j++){}returnj;}//测试主函数//程序的执行方式是://survive.exeNM//intmain(intargc,charargv[]){intn,m;intsurvivepos;//判断是不是有3个参数if(argc!=3){printf("Usage:%snum1num2",argv[0]);exit(1);}n=atoi(argv[1]
7、);m=atoi(argv[2]);printf("Working...");survivepos=survive(n,m);printf("总共有%d人,每次杀掉第%d个人,最终留下的是-->%d",n,m,survivepos);printf("====================GameOver====================");return0;}
此文档下载收益归作者所有