例题 7-2 埃及分数

import java.util.Scanner;

/* 算法竞赛入门经典 例题7-2 埃及分数问题:
 * 迭代加深搜索 从小到大枚举迭代深度上限 
 * 解答树模型:  
 *           第0层:根 
 *           第1层:1/2, 1/3, 1/4... 
 *           第2层: 1/2的孩子是1/2+1/3, 1/2+1/4, 1/2+1/5... 
 *                 1/3的孩子是1/3+1/4, 1/3+1/5, 1/3+1/6... 
 *           第3层: 1/2+1/3的孩子节点是1/2+1/3+1/4, 1/2+1/3+1/5... 
 *                  1/2+1/4的孩子节点是1/2+1/4+1/5, 1/2+1/4+1/6... 
 *           ... 
 * 剪枝策略: (算法竞赛入门经典p130详解) 
 * */
public class EgypFrac {
	static final int MAX = 1000;//最大迭代深度
	static int[] stack = new int[MAX];//保存结果的栈
	static int a, b;
	static int index = MAX - 1;

	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		while ((a = scanner.nextInt()) > 0) {
			b = scanner.nextInt();
			double frac = a * 1.0 / b;
			index = MAX - 1;
			isFound(0, i, frac, 2);
			for (int i = index + 1; i < MAX - 1; i++)
				System.out.printf("1/%d + ", stack[i]);
			System.out.println("1/" + stack[MAX - 1]);
		}
	}

	 /* frac要求的分数    res当前求得结果     deep当前迭代深度  start当前迭代起始值
	 */
	static boolean isFound(double res, int deep, double frac, int start) {
		for (int i = start;; i++) {
			double temp = res;
			temp += 1.0 / i;
			if (temp + (MAX - deep) * 1.0 / (i + 1) < frac)// 剪枝
				return false;
			if (temp > frac)// 结果略大进入下层循环 增加较小的分数值
				continue;
			if (Math.abs(temp - frac) < 1e-6) {//递归出口
				stack[index--] = i;
				return true;
			}
			if (deep < MAX) {
				if (isFound(temp, deep + 1, frac, i + 1)) {
					stack[index--] = i;
					return true;
				}
			}
		}
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值