有N个人围成一圈,顺序排号。
从第一个人开始报数,凡是报数中的尾数为3,或能被3整除,就退出圈子。
问最后留下的是原来第几号的人,最后报数报到多少?
比如:N=3,3个人,从第1号开始,从1开始报数
报数:1 2 3 4 5 6 7
编号:1 2 3(退出) 1 2 1(退出) 2(只剩最后一个人)
最后报数最高是7,剩下的人编号是2
编写代码,要求:
1)用数组保存游戏参加人列表(最多不超过N)
int LOOP[N];
2)数组取值为1或0,其中1代表参加报数,0代表被淘汰(1 TRUE / 0 FALSE)
3)键盘输入参加人数(人数<N)
4)编写函数处理游戏逻辑,输入指针(数组名)和参加人数(实际参加人数),输出报数最高值和最终胜利人编号
int loops(int* p, int nums, int* top, int* id);
p为输入指针,nums为输入人数,top为返回的最高值,id为返回的最终剩下的人编号
5)打印输出最高值和胜利者编号
其中:
1)函数内用 指针++ 操作遍历参加人
2)函数内用 指针赋值 操作完成从队尾到对头的循环
示例:
input: 3
output: id=2, top=7
#include<stdio.h>
#define N 50
void main()
{
int group[N];
int totalNum = 0, restNum = 0, count = 0, roundcount = 0;
scanf("%d", &totalNum);
//排号操作
for (int i = 0; i < totalNum; i++)
{
group[i] = i + 1;
}
restNum = totalNum;
//只要不只剩下一个人,那么就重复报数
while (restNum>1)
{
roundcount = 0;
//遍历整个数组,重复报数,直到一轮结束
while (roundcount < totalNum)
{
if (group[roundcount]!=0)
{
count++;
//报到3重头报数
if (count == 3)
{
group[roundcount] = 0;//退出的人以0为标识
restNum--;
count = 0;
}
}
roundcount++;
}
}
for (int i = 0; i < totalNum; i++)
{
if (group[i]!=0)
{
printf("%d", group[i]);
break;
}
}
}
写一个二维数组,第一行列出人数编号
第二行列出第一行-3的倍数编号的人之后的编号
...以此类推