首页 > 代码库 > 《C语言程序设计》9.6
《C语言程序设计》9.6
题目:
13个人围城一圈,从第一个人开始顺序报号1,2,3。凡报到3者退出圈子。找出最后留在圈子中的人原来的序号。
解析:
由题意得,所有人会一个个退出,让求最后留下来的那个人,可以想到让退出的人记上一个标记,转完一圈圈后,只会留一个人,然后遍历所有人,没被标记的则是最后留在圈子中的人。
实现:代码如下
#include <stdio.h> #include <stdlib.h> #define N 13 struct person { int number; int nextp; }link[N+1]; void CreastLink(struct person link[]); int main() { int b=0,k,j,i;//b(退出的人数),k(1,2,3),j(当前处理的结点号) CreastLink(link); j=N; while((N-b)>1)//因为要一圈圈的报数,一个个标记所以想到while循环,循环必定有跳出循环的条件,也就是要等圈内只有一个人就停止即(N-b)>1 { k=0; while(k!=3) { j=link[j].nextp;//指向下一个结点 if(link[j].number) k++; } link[j].number=0; b++; } for(i=1;i<=N;i++) { if(link[i].number) printf("%d",link[i].number); } return 0; } void CreastLink(struct person link[]) { int i; for(i=1;i<=N;i++) { link[i].number=i; } for(i=1;i<=N;i++) { if(i==N) { link[i].nextp=1; } else { link[i].nextp=i+1; } } return; }
《C语言程序设计》9.6
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。