#include<stdio.h> int findCoin(int coin[],int front,int back){ int i,sumf=0,sumb=0,sum=0; if(front+1==back) { if(coin[front]<coin[back]) return front+1; else return back+1; } if((back-front+1)%2==0) { for(i=front;i<=front+(back-front)/2;i++) sumf=sumf+coin[i]; for(i=front+(back-front)/2+1;i<=back;i++) sumb=sumb+coin[i]; if(sumf<sumb) return findCoin(coin,front,front+(back-front)/2); if(sumf>sumb) return findCoin(coin,front+(back-front)/2+1,back); } if((back-front+1)%2!=0) { for(i=front;i<=front+(back-front)/2-1;i++) sumf=sumf+coin[i]; for(i=front+(back-front)/2+1;i<=back;i++) sumb=sumb+coin[i]; sum=coin[front+(back-front)/2]; if(sumf<sumb) return findCoin(coin,front,front+(back-front)/2-1); if(sumf>sumb) return findCoin(coin,front+(back-front)/2+1,back); if(sumf+sum==sumb+sum) return front+(back-front)/2+1; }} int main(){ int coin[30]={1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}; printf("那個假幣是第%d個金幣!\n",findCoin(coin,0,29)); system("PAUSE"); return 0;}
1.如果金幣有偶數個,把金幣的前半部分與後部分的重量進行比較,假金幣在較小的那部分。2.如果金幣有奇數個,以正中間的那個金幣作為軸,將金幣分為前後兩個部分,如果這兩部分相當,說明這個為軸的金幣就是假金幣,如果不相當,假金幣就在品質較小的那部分。3.迴圈上述過程直到找到假金幣。