分治法找假币

来源:互联网 发布:spss mac 23 序列号 编辑:程序博客网 时间:2024/05/27 00:47
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<n;i++){coin[i] = input.nextInt();}input.close();weizhi = FalseCoin(coin,0,n-1)+1;System.out.printf("在%d个银币中,第%d个是假币",n,weizhi);}}

0 0
原创粉丝点击