这道题是谭浩强版C语言指针部分的练习题,我们分别用数组和链表的方法来实现。
解题思路如下:定义一个函数,接受人数n。我们初始化一个从1顺序排到n的数组,方便以后的操作。
思路就是按顺序循环报数,每当报到3的时候,让当前元素退出(将值置为0代表退出)。同时用一个值来记录当前队伍中还剩多少人,当队伍中还剩一人的时候,循环结束。
从数组中找出唯一一个不为0的值,返回即可。
代码如下所示
int call_number(int n) {
int a[20];
for (int i = 0; i < n; i++) {
a[i] = i + 1;
}//初始化数组
int* p = a;//当前报数的人
int count = 1;//应该报的数字
int remain = n;//剩余的人数
while (remain > 1) {
if (*p) {//下一个元素未退出
if (count == 3) {
*p = 0;
remain--;
count = 1;
}
else {
count++;
}
p++;
}
else {
p++;
}
if (p - a > n-1) {
p = a;
}
}
for (int i = 0; i < n; i++) {
if (a[i])
return a[i];
}
return 0;
}
int main() {
printf("%d", call_number(6));
return 0;
}
p是指针,指向当前要报数的元素。count