#include <iostream>
#include <ctime>
#include <cstdlib> // 包含产生随机数的库函数
#define MAX 1000
using namespace std;
int data[MAX];
int sum(int low, int high) {
int sum = 0;
for(int i = low; i <= high; i++) sum += data[i];
return sum;
}
int solve(int low, int high) {
if(low == high) return low;
if(low == high - 1) {
if(data[low] < data[high]) return low;
else return high;
}
int mid = (low + high) / 2;
int sum1, sum2;
if((high - low + 1) % 2 == 0) {
sum1 = sum(low, mid);
sum2 = sum(mid + 1, high);
printf("硬币%d-%d和硬币%d-%d称重一次:", low, mid, mid + 1, high);
} else {
sum1 = sum(low, mid - 1);
sum1 = sum(mid + 1, high);
printf("硬币%d-%d和硬币%d-%d称重一次:", low, mid - 1, mid + 1, high);
}
if(sum1 == sum2) {
printf("两者重量相同。\n");
return mid;
} else if(sum1 < sum2) {
printf("前者重量轻。\n");
if((high - low + 1) % 2 == 0) return solve(low, mid);
else return solve(low, mid - 1);
} else {
printf("后者重量轻。\n");
return solve(mid + 1, high);
}
}
int main (void) {
int n = 12;
for(int i = 0; i < n; i++) data[i] = 2;
srand((unsigned)time(NULL));
data[rand() % n] = 1;
printf("求解过程:\n");
printf("硬币%d是假币。\n", solve(0, n - 1));
return 0;
}