【发布时间】:2019-01-02 15:16:46
【问题描述】:
我正在编写一个程序,它试图找到 k > 1 的最小值,使得 a 和 b(两者都给定)的第 k 个根等于一个整数。
这是我的代码的 sn-p,我已对其进行了注释以进行澄清。
int main()
{
// Declare the variables a and b.
double a;
double b;
// Read in variables a and b.
while (cin >> a >> b) {
int k = 2;
// We require the kth root of a and b to both be whole numbers.
// "while a^{1/k} and b^{1/k} are not both whole numbers..."
while ((fmod(pow(a, 1.0/k), 1) != 1.0) || (fmod(pow(b, 1.0/k), 1) != 0)) {
k++;
}
差不多,我读入 (a, b),我从 k = 2 开始并递增 k 直到 a 和 b 的第 k 个根都等于 0 mod 1(这意味着它们可以被 1 整除,因此整数)。
但是,循环无限运行。我试过研究,我认为这可能与精度误差有关;不过,我不太确定。
我尝试过的另一种方法是更改循环条件以检查 a^{1/k} 的下限是否等于 a^{1/k} 本身。但同样,这会无限运行,可能是由于精度错误。
有人知道我该如何解决这个问题吗?
编辑:例如,当 (a, b) = (216, 125) 时,我想要 k = 3,因为 216^(1/3) 和 125^(1/3) 都是整数(即, 5 和 6)。
【问题讨论】:
-
对于浮点数,测试相等性是不合理的。见floating-point-gui.de
-
为什么一个返回值针对
1.0进行测试,而另一个只针对0? -
k的最小值,还是1/k的最小值(对应k的最大值)?后者似乎更有趣,因此更有可能成为要解决的实际问题。
-
(我看到你删除了你的question about the two integer sum。为了它的价值,我试图修复我的代码来处理你找到的反例。这里:ideone.com/JKRkqy)