package changyongsuanfa;
import java.util.Scanner;
public class JiaBi {
public static int FalseCoin(int coin[],int low,int high){
int result,i,sum1,sum2,sum3;
result = 0;
sum1 = sum2 = sum3 = 0;
if(high - low == 1){
if(coin[low] > coin[high]){
result = high;
return result;
}
else{
result = low;
return result;
}
}
else{
if((high - low + 1) % 2 == 0){//查找的个数为偶数个
for(i=low;i<=low+(high-low)/2;i++){//计算前半段之和
sum1 = sum1 + coin[i];
}
for(i=low+(high-low)/2+1;i<=high;i++){//计算后半段之和
sum2 = sum2 + coin[i];
}
if(sum1 > sum2){
result = FalseCoin(coin,low+(high-low)/2+1,high);//递归调用
return result;
}
else if(sum2 > sum1){
result = FalseCoin(coin,low,low+(high-low)/2);//递归调用
return result;
}
}
else{//查找的个数为奇数个
for(i=low;i<=low+(high-low)/2-1;i++){//计算前半段之和
sum1 = sum1 + coin[i];
}
for(i=low+(high-low)/2+1;i<=high;i++){//计算后半段之和
sum2 = sum2 + coin[i];
}
sum3 = coin[low+(high-low)/2];//奇数个时,中间那个银币的重量
if(sum1 > sum2){
result = FalseCoin(coin,low+(high-low)/2+1,high);//递归调用
return result;
}
else if(sum2 > sum1) {
result = FalseCoin(coin,low,low+(high-low)/2-1);//递归调用
return result;
}
if((sum1+sum3) == (sum2+sum3)){//假币为中间那个银币
result = low+(high-low)/2;
return result;
}
}
}
return result;
}
public static void main(String[] args) {
int weizhi;
System.out.print("分治法找假币\n");
System.out.print("请输入银币的总数量:\n");
Scanner input = new Scanner(System.in);
int n = input.nextInt();
int coin[] = new int[n];
System.out.print("请输入银币的真假\n");
for(int i=0;i
coin[i] = input.nextInt();
}
input.close();
weizhi = FalseCoin(coin,0,n-1)+1;
System.out.printf("在%d个银币中,第%d个是假币",n,weizhi);
}
}