有 个人去排队叫号,他们编号分别为 到 ,每个人手上都有一张其他人的号码 。初始时,所有 人没有被叫过。如果第 个人没有被叫过,他就叫自己手上的号码 。问整个叫号结束有,有多少人没 有叫过,按升序输出结果用c++
时间: 2024-04-19 19:24:42 浏览: 11
以下是用 C++ 实现的代码:
```cpp
#include <iostream>
#include <vector>
#include <algorithm>
int main() {
int n;
std::cout << "请输入人数 n:";
std::cin >> n;
std::vector<int> nums(n);
std::cout << "请输入每个人手上的号码:";
for (int i = 0; i < n; ++i) {
std::cin >> nums[i];
}
std::vector<bool> called(n, false);
int count = 0;
for (int i = 0; i < n; ++i) {
if (!called[i]) {
int current = nums[i];
while (!called[current - 1]) {
called[current - 1] = true;
current = nums[current - 1];
}
}
}
std::vector<int> notCalled;
for (int i = 0; i < n; ++i) {
if (!called[i]) {
notCalled.push_back(i + 1);
}
}
std::cout << "叫号结束后未被叫过的人数:" << notCalled.size() << std::endl;
std::cout << "未被叫过的人的编号(升序):";
for (int num : notCalled) {
std::cout << num << " ";
}
std::cout << std::endl;
return 0;
}
```
这段代码首先要求输入人数 n,然后输入每个人手上的号码。接下来,使用一个布尔数组 called 来记录每个人是否被叫过,初始时都设置为 false。然后,依次遍历每个人,在每个人未被叫过的情况下,根据手上的号码逐个叫号,直到叫到已经被叫过的号码为止。最后,将未被叫过的人的编号按升序输出。
注意:由于题目中的编号从 1 开始,而数组下标从 0 开始,所以在处理编号时需要做相应的转换。