博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
约瑟夫(Josephus)问题
阅读量:3948 次
发布时间:2019-05-24

本文共 1569 字,大约阅读时间需要 5 分钟。

古代某法官要判决n个犯人死刑,他有一条荒唐的逻辑,将犯人首尾相接排成圆圈,然后从第s个人开始数起,每数到第m个犯人,就拉出来处决;然后又数m个,数到的犯人又拉出来处决,以此类推。剩下的最后一人可以赦免。

编写程序,给出处决顺序,并给出哪一个人可以活下来。
注:大体的思路以及需要注意的点都在注释中了,直接上代码了。

//定义结点typedef struct _josephus{
int num; struct _josephus *next;}josephus;int n; //全局变量,记录共有几名犯人(结点)//犯人数目(创建结点)josephus *Creat(josephus *pHead){
josephus *pEnd,*pNew; int i; printf("犯人数:"); scanf("%d",&n); for(i = 1; i <= n; i++) {
pNew = (josephus *)malloc(sizeof(josephus)); pNew->num = i; pNew->next = NULL; if(pHead == NULL) pHead = pNew; else pEnd->next = pNew; pEnd = pNew; } pEnd->next = pHead; //令尾指针指向头结点 return pHead;}//处决函数josephus *fun(josephus *pHead, int s, int m){
josephus *temp = pHead; josephus *p = NULL; //指向要处决的犯人(结点) int i; //遍历寻找到起始位置 for(i = 1; i < s; i++) temp = temp->next; printf("kill: "); //循环判断处决犯人(删除结点) while(n > 1) {
p = temp; for(i = 1; i < m; i++) {
temp = p; p = p->next; } printf("%d ",p->num); temp->next = p->next; //将要处决的犯人(结点)前后连接起来 free(p); temp = temp->next; //处决完一次后,还要继续处决到只剩一个犯人,因此temp指向被删除结点的下一个结点 n--; } printf("\n"); return temp;}int main(){
int s,m; josephus *pHead = NULL; pHead = Creat(pHead); printf("s,m: "); scanf("%d %d",&s,&m); pHead = fun(pHead,s,m); printf("存活: %d\n",pHead->num); free(pHead); pHead = NULL; //防止产生野指针 return 0;}

!@#$%^&*~

转载地址:http://nnqwi.baihongyu.com/

你可能感兴趣的文章
如何adb shell进入ctia模式
查看>>
Contacts Provider 联系人存储
查看>>
android 图库播放幻灯片时灭屏再亮屏显示keyguard
查看>>
android 图库语言更新
查看>>
android camera拍照/录像后查看图片/视频并删除所有内容后自动回到camera预览界面
查看>>
android 图库中对非mp4格式的视频去掉"修剪"功能选项
查看>>
how to disable watchdog
查看>>
android SDIO error导致wifi无法打开或者连接热点异常的问题
查看>>
android USB如何修改Serial Number or SN?
查看>>
android 用svn管理的版本编译出来有问题
查看>>
android 如何用jar包代替java代码编译
查看>>
android 数据连接关闭的情况下如何让彩信发不出去
查看>>
android 编辑彩信,加入几页铃声,预览暂停界面,铃声名字不见了
查看>>
android 在新建短信时,加入名称为","(英文逗号)的联系人时,应用崩溃的修改
查看>>
android 关于LCD背光调节渐变过程引起背光闪烁问题
查看>>
android 保存具有不同前缀的同一号码分别为A和B,用其中一个呼叫,通话记录一直显示另一个联系人名字的问题
查看>>
android 在手机中预置联系人/Service Number
查看>>
android 系统语言为英语时,Contacts联系人名字含有特殊前缀后缀(Dr. Mr. Lt等)时的相关问题处理
查看>>
android 短信下,添加联系人,进入联系人多选界面出现联系人电话号码晃动的问题
查看>>
android 对一个合并后的联系人选择编辑,手机屏幕会缓慢变暗后再进入编辑界面的问题
查看>>