数学趣题——寻找假币

递归分治二分查找法

递归分治二分查找法

   1: #include "stdio.h"
   2:  
   3: int getFalseCoin(int coin[], int low, int high)
   4: {
   5:     int i, sum1 = 0, sum2 = 0, sum3 = 0;
   6:  
   7:     if(low + 1 == high)
   8:     {
   9:         if(coin[low] < coin[high]) return low + 1;
  10:         else return high + 1;
  11:     }
  12:  
  13:     if((high - low + 1) % 2 == 0)                    /*n是偶数*/
  14:     {
  15:         for(i = low; i <= low + (high - low) / 2; i++)
  16:             sum1 = sum1 + coin[i];               /*前半段和*/
  17:  
  18:         for(i = low + (high - low) / 2 + 1; i <= high; i++)
  19:             sum2 = sum2 + coin[i];               /*后半段和*/
  20:  
  21:         if(sum1 < sum2) return getFalseCoin(coin, low, low + (high - low) / 2);
  22:  
  23:         if(sum1 > sum2) return getFalseCoin(coin, low + (high - low) / 2 + 1, high);
  24:     }
  25:  
  26:     if((high - low + 1) % 2 != 0)
  27:     {
  28:         for(i = low; i <= low + (high - low) / 2 - 1; i++)
  29:             sum1 = sum1 + coin[i];               /*前半段和*/
  30:  
  31:         for(i = low + (high - low) / 2 + 1; i <= high; i++)
  32:             sum2 = sum2 + coin[i];               /*后半段和*/
  33:  
  34:         sum3 = coin[low+(high-low)/2];
  35:  
  36:         if(sum1 < sum2)
  37:             return getFalseCoin(coin, low, low + (high - low) / 2 - 1);
  38:  
  39:         if(sum1 > sum2)
  40:             return getFalseCoin(coin, low + (high - low) / 2 + 1, high);
  41:  
  42:         if(sum1 + sum3 == sum2 + sum3) return low + (high - low) / 2 + 1;
  43:     }
  44:  
  45: }
  46:  
  47: int main()
  48: {
  49:     int coin[30] = {2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 2};
  50:     printf("The %dth coin is false\n", getFalseCoin(coin, 0, 29));
  51:     return 0;
  52: }

转载于:https://www.cnblogs.com/steven_oyj/archive/2010/05/27/1744998.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值