JAVA算法:埃及分数(Egyptian Fraction)

JAVA算法:埃及分数(Egyptian Fraction)

问题描述:

埃及分数是指分子是1的分数,也叫单位分数。古代埃及人在进行分数运算时。只使用分子是1的分数。因此这种分数也叫做埃及分数,或者叫单分子分数。在我们现今所使用的分数中,当有2个物品要平均分给3个人的时候,每个人可以取得2个1/3。你可以算成2/3 = 1/3 + 1/3。那么,古埃及的人们,是怎么算的呢?首先,把 2 个物品分成 4 个 1/2,先给每个人 1 个 1/2,剩下的 1 个1/2 再分成 3 等分,均分结果,每人分到 1/2 加 1/2 的 1/3,也就是 1/2 + 1/6 = 2/3。

一个古老的传说是:

老人弥留之际,将家中11匹马分给3个儿子,老大1/2,老二1/4,老三1/6。二分之一是5匹半马,总不能把马杀了吧,正在无奈之际,邻居把自己家的马牵来,老大二分之一,牵走了6匹;老二四分之一,牵走了3匹;老三六分之一,牵走了2匹。一共11匹,分完后,邻居把自己的马牵了回去。即11/12=1/2+1/4+1/6。

埃及分数的一些表示例子:

  • 2/3 等价于 1/2 + 1/6
  • 6/14 等价于 1/3 + 1/11 + 1/231
  • 12/13 等价于 1/2 + 1/3 + 1/12 + 1/156

写一个算法,求埃及分数的表示方法。


算法设计

package com.bean.algorithmbasic;

public class EgyptFractionDemo3 {
	
	/*
	 * numerator 代表分子
	 * denominator 代表分母
	 * 
	 * 
	 * 例如: numerator = 2 ; denominator =4 
	 * 2/4  进行约分
	 * 2/5  进行计算
	 * 
	 * */
	public static void egyptFraction(int numerator, int denominator) {
		
		int total=0; //计数器
		System.out.print(numerator + "/" + denominator + "=");
		while(true) {
			/* 如果分子能够整除分母,则对原分数进行约分 , 保持分子为1 */
			if (denominator % numerator == 0) {
				denominator = denominator / numerator;
				numerator = 1;
			}

			/* 分子为1时,直接输出结果,中止循环 */
			if (numerator == 1) {
				System.out.print(numerator + "/" + denominator);
				total++;
				break;
			} else {
				/* 保留原有的分子与分母的值 */
				int d = denominator;
				int n = numerator;

				/* 得到比当前分数小的最大埃及分数的分母,并输出找到的最大埃及数 */
				int num = denominator / numerator + 1;
				System.out.print(1 + "/" + num + "+");
				total++;

				/* 得到余数的分子与分母,继续循环 */
				denominator = d * num;
				numerator = n * num - d;
			}
		}
		System.out.println();
		System.out.println("可分解为埃及数的个数为: " + total);
	}

	public static void main(String[] args) {
		
		int numerator = 2;
		int denominator = 5;
		egyptFraction(numerator,denominator);
	}

}

程序运行结果:

2/5=1/3+1/15
可分解为埃及数的个数为: 2


DFS算法设计

package com.bean.algorithmbasic;

public class EgyptFractionDemo2 {
	
	static int N=100000;
	static int[] array=new int[N];
	
	public static void main(String [] args){  
        int nums1 = 2;  
        int nums2 = 15;  
        for(int i=1;;i++) {
        	if(dfs(0,i,nums1,nums2)==1) {
        		break;
        	}
        }
        
    }  
    
	/*
	 * 用于进行判断
	 * */
	public static double is_equal(int a, int b, int cur)  
	{  
	    double sum = 0;  
	    for (int i = 0; i <= cur; i++)  
	        sum += (double)1 / array[i];  
	    return (double)a / b - sum;  
	}  
	  
	public static int dfs(int cur, int d, int a, int b)  
	{  
	    if (cur == d)  
	        return 0;  
	    int start = (int) ((int)(d - cur) / (is_equal(a, b, cur - 1)));  
	    int end = cur == 0 ? 2 : array[cur-1] + 1;  
	    for (int i = start;i>=end; i--)  
	    {  
	        array[cur] = i;  
	        double p = is_equal(a, b, cur);  
	        if (Math.abs(p) <= 0.00001)  
	        {  
	            for (int j = 0; j <= cur; j++)  
	                System.out.print(array[j]+" ");  
	            System.out.println();  
	            return 1;  
	        }  
	        else if (p > 0)  
	        {  
	            if (dfs(cur + 1, d, a, b)!=0)  
	                return 1;  
	        }  
	    }  
	    return 0;  
	}  

}

第三种算法设计

package com.bean.algorithmbasic;


public class EgyptFractionDemo {
	
	public static void main(String [] args){  
        int nums1 = 2;  
        int nums2 = 15;  
        egyptFraction(nums1, nums2);  
    }  
      
    public static void egyptFraction(int num1, int num2){  
        int trade = 0;  
        int maxComDiv = 0;  
        while(num1 > 1){  
            trade = num2 / num1 + 1;  
            System.out.println(1 + "/" + trade);  
            num1 = num1 * trade - num2;  
            num2 = num2 * trade;  
            maxComDiv = maxComDiv(num1, num2);  
            if(maxComDiv > 1){  
                num1 = num1 / maxComDiv;  
                num2 = num2 / maxComDiv;  
            }  
        }  
        System.out.println(1 + "/" + num2);  
    }  
      
      
    public static int maxComDiv(int num1, int num2) {  
        int remaind = 0;  
        while(num2 != 0){  
            remaind = num1 % num2;  
            num1 = num2;  
            num2 = remaind;  
        }  
        return num1;  
    }  

}

 

相关推荐
©️2020 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页