美国计算机协会国际大学程序设计竞赛亚洲地区D亨利

ACM International Collegiate Programming Contest Asia Regional D Henry

本文关键字:竞赛 程序设计 亚洲地区 亨利 大学 计算机 美国      更新时间:2023-10-16

给定分数a / b,其中ab为正整数,a < b,选择最大的单位分数1 / x_1,使1 / x_1 <= a / b。然后从a / b中减去1 / x_1,并对剩余部分重复此过程:选择最大的单位分数1 / x_2,使1 / x_2 <= (a / b) - (1 / x_1)。重复一遍,直到没有余数。这个过程将产生一系列单位分数1 / x_1, 1 / x_2, 1 / x_3, ...,这些分数加起来等于给定分数a / b。对于任何输入分数a / b,该过程总是以有限数量的不同单位分数终止。编写一个程序,输出结果序列中最后一个分数的分母。

例子:

5/7 = 1/2 + 1/5 + 1/70
样本输入:

3 
4 23
5 7
8 11
输出:

138
70
4070

代码:

我的代码是c++语言

#include <iostream>
#include <fstream>
using namespace std;
int testCase;
double a;
double son;
double mom;
int main()
{
    ifstream file("input.txt");
    file >> testCase;
    while (testCase--)
    {
        file >> son;
        file >> mom;
        while (son != 1)
        {
            a = (int)(mom / son) + 1;
            son = (son * a) - mom;
            mom = mom * a;
        }
        cout << mom << endl;
    }
    file.close();
}

我认为我的算法是正确的,但是我的学校评分系统说它超过了运行时间限制。我不知道为什么。

您可能忘记在每一步中将momson除以它们的最大公约数(GCD)。这可能会让某些示例永远运行或比预期运行的时间更长。检查一下问题是否出在这里。另外,为什么使用double类型的sonmom ?分数的分子和分母应该是整数。如果它们可以是非常大的整数,只需使用unsigned long intsize_t(在c++中同义)。double数据类型没有size_t那么多有效数字