给定分数a / b
,其中a
和b
为正整数且a < b
,选择最大单位分数1 / x_1
,使1 / x_1 <= a / b
}。然后从1 / x_1
中减去a / b
,并对余数重复该过程:选择最大单位分数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();
}
我认为我的算法是正确的,但是我的学校评分系统说它超出了运行时限制。我不知道为什么。
答案 0 :(得分:1)
您可能忘记在每一步将mom
和son
除以最大公约数(GCD)。这可能会让某些示例永远或长于预期运行。检查这是否是问题。另外,为什么对double
和son
使用mom
类型?分数的分子和分母应该是整数。如果它们可以是非常大的整数,只需使用unsigned long int
或size_t
(c ++中的同义词)。 double
数据类型的有效数字不是size_t
。