A,B,C,D,E,F,G,H共8人站成一排,按下图所示的方法从1开始报数。问谁先报到指定整数?要求使用switch语句编程。 A B C D E F G H 1→ 2→ 3→ 4→ 5→ 6→ 7 ↘ ↙14←13←12←11← 10←9← 8 15→16→… c语言
时间: 2024-10-28 11:09:25 浏览: 25
js+canvas实现两张图片合并成一张图片的方法
这是一个经典的排列问题,可以利用数组和循环结合C语言的switch语句来解决。首先,我们需要确定每个人报到特定数字的顺序。给定的规则是每次报完数后,如果剩余的人数除以8余数为n,则第n个人将跳过当前数字直接报下一个。
我们可以编写如下的C语言程序:
```c
#include <stdio.h>
int findFirstToReport(int target) {
int people[8] = {1, 2, 3, 4, 5, 6, 7, 0}; // 初始化人数数组,最后一位表示报过的人
int index = 0;
while (people[index] != target - 1) { // 当前还没达到目标减1
switch (index % 8) {
case 0: // 如果是第1位,继续报
index++;
break;
case 1: // 如果是第2位,报1然后跳过
index += 2;
break;
case 2: // 如果是第3位,报2然后跳过
index += 2;
break;
// ...类似地处理其他位
default: // 如果是其他位,正常报数加1
index++;
}
}
return index + 1; // 返回第一个报到target的人的位置(+1是因为0是起始位置)
}
int main() {
int targetNumber;
printf("请输入你要找的目标数字:");
scanf("%d", &targetNumber);
if (targetNumber > 15 || targetNumber % 8 == 0) {
printf("报到%d的人不存在,因为报数规则限制。\n", targetNumber);
} else {
int personPosition = findFirstToReport(targetNumber);
char names[9][2] = {"A", "B", "C", "D", "E", "F", "G", "H", " "};
printf("当报到%d时,%s会第一个报到。\n", targetNumber, names[personPosition - 1]);
}
return 0;
}
```
用户输入目标数字后,程序会计算出对应的是哪个人,并打印出来。注意,这个程序假设目标数字不会超过15,因为题目中给出的序列只包含了1到15。如果目标大于15,程序会告知不存在对应的人。另外,由于最后一个位置用0表示已报数,所以索引是从1开始计数的。
阅读全文