HJ 82 将真分数分解为埃及分数

思路:

1. 暴力破解算法,从 [2, INT_MAX] 选择分母,组成埃及分数 1/Temp , 与原分数相减,得到新的真分数,继续选择 Temp,直到相减后的结果是0;

挑选 Temp 的时间复杂度为 O(n);

2. 贪心算法,假设原真分数为 0 < a / b < 1,令商 q = b / a,余数 r = b % a,可知真分数 a / b > 1/ (q+1) ,可以选择 q+1 作为暴力破解选出的分母 Temp,

然后相减,剩下的分数作为新的真分数,继续计算;挑选 Temp 的时间复杂度为 O(1);

题目描述

分子为1的分数称为埃及分数。现输入一个真分数(分子比分母小的分数,叫做真分数),请将该分数分解为埃及分数。如:8/11 = 1/2+1/5+1/55+1/110。

注:真分数指分子小于分母的分数,分子和分母有可能gcd不为1!

如有多个解,请输出任意一个。

请注意本题含有多组样例输入!

Example:

#include<cstdio>
using namespace std;

int main()
{
    unsigned  divident, divisor;
    while(scanf("%u/%u", &divident, &divisor) != EOF) {
        if(divident == 0) { printf("0\n"); continue; }
        while(divident > 1) {
            unsigned r = divisor % divident;
            unsigned q = divisor / divident;
            if(r == 0) {
                divisor = q;
                break;
            }
            printf("1/%d+", q+1);
            divident -= r;
            divisor  *= q+1;
        }
        printf("1/%d\n", divisor);
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值