华为机试-082-中等-HJ82.将真分数分解为埃及分数


一、描述

分子为1的分数称为埃及分数。现输入一个真分数(分子比分母小的分数,叫做真分数),请将该分数分解为埃及分数。如:8/11 = 1/2+1/5+1/55+1/110。
注:真分数指分子小于分母的分数,分子和分母有可能gcd不为1!
如有多个解,请输出任意一个。

1.1、输入描述

输入一个真分数,String型

1.2、输出描述

输出分解后的string

二、示例

2.1、示例1

输入:

8/11
2/4

输出:

1/2+1/5+1/55+1/110
1/3+1/6

说明:
第二个样例直接输出1/2也是可以的

三、答案(java)

3.1、方法一

package com.tzq.hwod;

/**
数学家斐波那契提出的一种求解***分数的贪心算法,准确的算法表述应该是这样的:
设某个真分数的分子为a,分母为b;
把c=(b/a+1)作为分解式中第一个***分数的分母;
将a-b%a作为新的a;
将b*c作为新的b;
如果a等于1,则最后一个***分数为1/b,算法结束;
如果a大于1但是a能整除b,则最后一个***分数为1/(b/a),算法结束;
否则重复上面的步骤。
**/
import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		while (in.hasNext()) {
			String res = "";
			String[] arr = in.nextLine().split("/");
			String pre = "";
			int a = Integer.valueOf(arr[0]);
			int b = Integer.valueOf(arr[1]);
			while (true) {
				int c = b / a + 1;
				res += "1/";
				res += c;
				a = a - b % a;
				b = b * c;
				res += "+";
				if (a == 1) {
					res += "1/";
					res += b;
					break;
				} else if (a > 1 && b % a == 0) {
					res += "1/";
					res += b / a;
					break;
				}
			}
			System.out.println(res);
		}
	}
}

在这里插入图片描述

四、答案(python 3)

4.1、方法一

#!/usr/bin/python
# -*- coding: UTF-8 -*-

while True:
    try:
        a,b = map(int,input().split('/'))
        a = a * 10
        b = b * 10
        res = []
        while a:
            for i in range(a,0,-1):
                if(b % i == 0):
                    res.append('1' + '/' + str(int(b / i)))
                    a = a - i
                    break
        print('+'.join(res))
    except:
        break

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Tzq@2018

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值