标签:c语言 int number turn size main next ++ idt
题目:
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语言 int number turn size main next ++ idt
原文地址:http://www.cnblogs.com/LuRenJiang/p/6441892.html