解题思路:
不采取删除被淘汰者的方式,固定总人数,用0代表被淘汰,1代表未被淘汰。指针顺次指向每个人以模拟报数过程,当每轮次指针指向最后一人时,用while循环使其指回第一人。具体见代码注释。
注意事项:
参考代码:
#include<stdio.h>
#include<string.h>
#include <math.h>
int main()
{
int N=0;
scanf("%d",&N);//输入玩家数
int id[100]={0};
for(int i=1;i<=N;i++)
id[i]=i;//人员最初编号
int number[100];//人员报数编号(1或2或0,此处采取取余的方式,所有3的倍数对3取余都是0)
for(int i=1;i<=100;i++)
number[i]=1;
int flat=0,m=0;//flat记录总报数次数,m记录一个回合被淘汰的人数。
int *p=id;
while(N-m>1)//当剩余人数不止一人时
{
p=&id[1];//从所有玩家的第一个开始
m=0;//每轮次重新统计被淘汰人数
for(int i=1;i<=N;i++)
{
if(number[i]!=0)//若玩家未被淘汰
{
flat++;//报数次数加一
number[i]=flat%3;//获得所报数字
p++;//指向下一人
}
if(number[i]==0)//若玩家已被淘汰
{
p++;//不增加报数次数,直接跳过他
m++;//记录已淘汰人数。
}
}
}
for(int i=1;i<=N;i++)//打印最终的胜利者编号,即所报数字非0的玩家号
{
if(number[i]!=0)
printf("%d",id[i]);
}
return 0;
}
0.0分
0 人评分
C语言程序设计教程(第三版)课后习题6.10 (C语言代码)浏览:1090 |
C语言程序设计教程(第三版)课后习题6.5 (C语言代码)浏览:660 |
字符逆序 (C语言代码)浏览:706 |
C语言程序设计教程(第三版)课后习题1.5 (C语言代码)浏览:490 |
C语言程序设计教程(第三版)课后习题9.1 (C语言代码)浏览:710 |
1126题解浏览:649 |
字符串输入输出函数 (C语言代码)浏览:2605 |
1035 题解浏览:875 |
C语言程序设计教程(第三版)课后习题9.1 (C语言代码)浏览:653 |
C语言程序设计教程(第三版)课后习题10.3 (C语言代码)浏览:871 |