程序员奥运:分数分解问题

问题描述:
奥运裁判喜欢把一个分数分解成类似:1/a + 1/b 的格式;
这里a != b 为不同的整数, 分子必须为1;
样例输出:
比如分数为2/15:
可分解为:
1:1/8 + 1/120
2:1/9 + 1/45
3:1/10 + 1/30
4:1/12 + 1/20
如果分数为2/45则有多少种结果?
问题分析:
1:使用穷举法;
2:因为要分解成两个分数所以至少有一个大于一半;即我们其中的一个分母由fm1开始向上穷举:fm1 = num / 2 +1;
3 : 有了第一个分母,则第二个分母可由减法算出fm2 = fm1 * (fm1 / (fenzi)),此部分就可省去穷举浪费的时间和内存;fenzi = 2 * fm1 - num;
4:计算时控制条件为 num * fm1 % fenzi == 0;(即分母比分子的余数为零);

代码演示:

#include <iostream>
using namespace std;

void fen_jie(int num)
{
    int fm1, fm2, fenzi, code = 0;

    for (fm1 = num / 2 + 1; ; ++fm1)
    {
        fenzi = 2 * fm1 - num;

        if ( fenzi >= fm1) break;
        if (num * fm1  % fenzi == 0)
        {
            fm2 = num * fm1 / fenzi;

            cout << ++code << " : "
                 << "1/" << fm1
                 << "  " << "1/" << fm2 << endl;
        }
    }
    return ;
}

int main()
{
    int num;
    cin >> num;

    fen_jie(num);

    return 0;
}

45的结果为:7种;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值