假设n个硬币(1<=n<=100),编号1~n, 其中有且仅有一枚假币,假币比真币重量轻。采用天平称重方式找到这枚假币,并用C++给出求解过程。
时间: 2024-03-25 17:36:50 浏览: 107
对N枚硬币中假币求解问题
好的,以下是用C++实现的代码:
```cpp
#include <iostream>
#include <vector>
using namespace std;
// 将硬币分成两组
vector<int> split_coins(const vector<int>& coins) {
int mid = coins.size() / 2;
return vector<int>(coins.begin(), coins.begin() + mid);
}
// 称重函数,返回硬币的总重量
int weigh_coins(const vector<int>& coins) {
int weight = 0;
for (int coin : coins) {
weight += coin;
}
return weight;
}
// 递归函数,找到假币并返回其编号
int find_fake_coin(const vector<int>& coins) {
if (coins.size() == 1) {
return coins[0];
} else {
// 将硬币分成两组
vector<int> left_coins = split_coins(coins);
vector<int> right_coins(coins.begin() + left_coins.size(), coins.end());
// 称重
int left_weight = weigh_coins(left_coins);
int right_weight = weigh_coins(right_coins);
if (left_weight == right_weight) {
// 假币在后半部分
return find_fake_coin(vector<int>(coins.begin() + left_coins.size(), coins.end()));
} else if (left_weight < right_weight) {
// 假币在前半部分
return find_fake_coin(left_coins);
} else {
// 假币在后半部分
return find_fake_coin(right_coins);
}
}
}
int main() {
int n;
cin >> n;
// 初始化硬币编号和重量
vector<int> coins(n);
for (int i = 0; i < n; i++) {
coins[i] = i + 1;
}
coins[rand() % n] = -1; // 随机选择一枚假币并标记为-1
// 找到假币并输出其编号
int fake_coin = find_fake_coin(coins);
cout << "The fake coin is coin #" << fake_coin << endl;
return 0;
}
```
这段代码中,我们使用了 `vector` 来存储硬币的编号和重量,使用了递归函数 `find_fake_coin()` 来找到假币。在 `main()` 函数中,我们随机选择一枚硬币标记为假币,并输出其编号。
阅读全文