I. Descripción del problema
Hay una serie de monedas en una bolsa, que es una falsificación de dinero y la falsificación de dinero y el dinero real y exactamente lo mismo, sólo conocen la falsificación más ligero que las monedas reales. ¿Cómo encontrar Mientras que el dinero falso?
En segundo lugar, el análisis algoritmo
La estrategia de dividir y conquistar, la moneda se divide en dos planos (número impar de monedas tomadas después de que biseca el centro de la moneda), y una comparación de ambos lados de la peso de tamaño. Peso izquierda, en la parte derecha de la moneda falsa, y viceversa, y luego continuar a mirar a la mitad región falsificación de la mitad izquierda tiene una falsificación (intermedio o falsificada), hasta que el resto de dos monedas, tamaños, posición de retorno de dinero falso.
complejidad del tiempo: O (log n).
En tercer lugar, la aplicación del código
#include <stdio.h>
#define MAXNUM 30
int FalseCoin(int coin[], int low, int high)
{
// 两个硬币的比较
if (low + 1 == high) {
if (coin[low] < coin[high]) {
return low + 1;
}
return high + 1;
}
int sum1 = 0, sum2 = 0, sum3 = 0;
int mid = (low + high) >> 1;
int i;
// 偶数个硬币
if ((high - low + 1) % 2 == 0 ) {
// 左半段
for (i = low; i <= mid; i++) {
sum1 += coin[i];
}
// 右半段
for (i = mid + 1; i <= high; i++) {
sum2 += coin[i];
}
// 左侧重,则假币在右半段
if (sum1 > sum2) {
return FalseCoin(coin, mid + 1, high);;
}
// 右侧重,则假币在左半段
else if (sum2 > sum1){
return FalseCoin(coin, low, mid);;
}
else {
printf("没有假币。输入的硬币重量有误!");
}
}
// 奇数个硬币
else {
// 左半段,除去中间的一个硬币
for (i = low; i <= mid - 1; i++) {
sum1 += coin[i];
}
// 右半段,除去中间的一个硬币
for (int i = mid + 1; i <= high; i++) {
sum2 += coin[i];
}
sum3 = coin[mid];
// 左侧重,则假币在右半段
if (sum1 > sum2) {
return FalseCoin(coin, mid + 1, high);
}
// 右侧重,则假币在左半段
else if (sum2 > sum1){
return FalseCoin(coin, low, mid - 1);
}
else {
// 中间的是假币
if (coin[mid] != coin[low]) {
return mid + 1;
}
else {
printf("没有假币。输入的硬币重量有误!");
}
}
}
return -1;
}
int main()
{
int coin[] = { 1, 1, 1, 0, 1, 1, 1, 1, 1, 1 };
int position = FalseCoin(coin, 0, 9);
printf("假币在第 %d 个位置", position);
return 0;
}
假币在第 4 个位置