题目
本题是谭浩强《C程序设计课后习题》题8.5。
题目:
有n个人围成一圈,顺序排号。从第1个人开始报数(从1到3报数), 凡报到3的人退
出圈子, 问最后留下的是原来第几号的那位。
以下是本篇文章正文内容,欢迎朋友们进行指正,一起探讨,共同进步。——来自考研路上的lwj
一、解题思路
思路:
本题主要思路是当存活人数大于1的时候,就会产生报道3的人,每当有人报到3,把它置为0,然后从这个数后面一个数重新开始报数1.如此往复,直到只剩下一个存活人数。
二、代码部分
1.引入库
代码如下(示例):
#include<stdio.h>
2.主函数部分
代码如下(示例):
int main()
{
int n;
printf("请输入总人数:");
scanf("%d", &n);
int people[100] = {0};
for (int i = 0; i < n; i++)
people[i] = i + 1;//给每个人进行编号。
int remain = n;//存活人数
int num_off = 0;//当前报数
while (remain > 1)
{
int* p = people;
while (p != people + n)
{
if (*p)
{
num_off++;//当前位置还存在人的话,报数
if (num_off == 3)//报数为3,则剔除
{
*p = 0;
num_off = 0;//报数重新开始
remain--;//存活人数-1
}
}
p++;
}
}
for(int i=0;i<n;i++)
if (people[i] != 0)
{
printf("存活的人的编号:%d\n", people[i]);
break;
}
return 0;
}
三、执行结果
输出:
请输入总人数:4
存活的人的编号:1