您的位置:首页 > 编程语言 > C语言/C++

复习C++--分治算法--找出假币

2014-03-17 11:12 369 查看
题目:真币的重量相等,假币的重量比假币轻,只有一个假币
#include <iostream>
using namespace std;
#define  MAXNUM 100

int getFalseCoin(int coin[],int start,int end){
//出口
if(end-start==1){
return coin[start]>coin[end]?end:start;
}
int leftWeight=0,rightWeight=0;
//如果数量是奇数
if((end-start)%2==0){
//左边的总值为从start加到end/2-1。右边的总值为end/2到end-1
for(int i=start;i<end/2;i++) leftWeight+=coin[i];
for(int j=end/2;j<end;j++) rightWeight+=coin[j];
//如果左边总值==右边总值 返回 end
if(leftWeight==rightWeight) return end;
//否则调用getFalseCoin(coin,start,end-1);
else getFalseCoin(coin,start,end-1);
}else{
//如果数量是偶数
//如果左边总值小于:getFalseCoin(coin,start,end/2)
for(int i=start;i<=end/2;i++) leftWeight+=coin[i];
for(int j=end/2+1;j<=end;j++) rightWeight+=coin[j];
if(leftWeight<rightWeight) getFalseCoin(coin,start,end/2);
//否则:getFalseCoin(coin,end/2+1,end)
else getFalseCoin(coin,end/2+1,end);
}
}
void main(){

int coin[MAXNUM];
int k;
printf("请输入银币的总的个数:\n");
cin>>k;
cout<<"请依次输入银币的重量"<<endl;
for(int i=0;i<k;i++){
cin>>coin[i];
}
int n=getFalseCoin(coin,0,k-1);
cout<<"银币最小的索引为:"<<n<<endl;
return ;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: