
转圈报数问题(C语⾔):有n个⼈围成⼀圈,顺序排号……
问题描述:
有n个⼈围成⼀圈,顺序排号。从第1个⼈开始报数(从1到3报数),凡报到3的⼈退出圈⼦,问最后留下的是原来第⼏号那位。
题⽬分析:
这道题⽬是我们在⽇常⽣活中也能经常见到的⼀种报数⼩游戏。⾸先我们先分析⼀下游戏的核⼼——轮流报数 这个过程的本质是什么呢?
我们分析⼀下游戏的过程。
我们先举⼀个实例:假如有5个⼈ 分别为ABCDE
第⼀轮:A报1 B报2 C报3(被淘汰) D报1 E报2
第⼆轮:A报3(被淘汰)B报1 C(已被淘汰)D报2 E报3(淘汰)
第三轮:A(已被淘汰)B报1 C(已被淘汰)D报2 E(已被淘汰)
#include
int main()
{
int a[120]={0}; //
建⽴数组
int i,n,k,j,final_num,sum;
printf("Plea enter n(<120):"); // 120
确定参与⼈数这⾥图⽅便就直接将数组定为了⼈以下也可⽤动态数组解决
scanf("%d",&n); //n
表⽰参与的总数
sum=n;//sum
为在场总数
for(i=0;i<n;i++) a[i]=1; //1
将所有参赛选⼿的数值设为
for(k=0,i=1;;k++) // k i
每⼀轮的循环⽤表⽰第⼏位选⼿表⽰报的数
{
printf("n");
printf("No.%d now is %d",k+1,i);
if(k==n-1 && sum==1) {printf("n***Winner has been produced***n"); break;} // sum==1 k==n-1
结束循环的条件:在场仅为⼀⼈即前⾯加上是为了最后⼀
轮也能完整展⽰
if(a[k]==0 && k==n-1) {k=-1; printf(" nEnd of the Round nLeft:%dn",sum); continue;} //
⼀轮循环结束的标志(最后⼀个已被淘汰)
if(a[k]==0) {printf(" skip"); sum——; continue;} //:
被跳过⼈被跳过循环也跳过
if(i%3==0) {a[k]=0; printf(" out");}//3
报到的被淘汰
el printf(" valid");
if(k==n-1)
{
k=-1;
printf(" nEnd of the Round nLeft:%dn",sum);//
⼀轮循环结束的标志
}
i=i+1; //
每个⼈报的数字递增
}
for(i=0;i<=n;i++) //1
找到数组中唯⼀的即获胜者
{
if(a[i]==1)
final_num=i+1;
}
printf("n");
printf("The winner is No.%dn",final_num);
}
当总数为7时 程序运算的内容应该如下:
Plea enter n(<120):7
No.1 now is 1 valid
No.2 now is 2 valid
No.3 now is 3 out
No.4 now is 4 valid
No.5 now is 5 valid
No.6 now is 6 out
No.7 now is 7 valid
End of the Round
Left:5
No.1 now is 8 valid
No.2 now is 9 out
No.3 now is 10 skip
No.4 now is 10 valid
No.5 now is 11 valid
No.6 now is 12 skip
No.7 now is 12 out
End of the Round
Left:3

本文发布于:2023-11-14 16:27:03,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/zhishi/a/169995042331000.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文word下载地址:转圈报数问题(C语言):有n个人围成一圈,顺序排号…….doc
本文 PDF 下载地址:转圈报数问题(C语言):有n个人围成一圈,顺序排号…….pdf
| 留言与评论(共有 0 条评论) |