我正在编写一个程序,尝试找到最小的k值(k > 1),使得a和b(两者都已给定)的k次方根等于整数。
基本上,我读入(a,b),并从k = 2开始递增k,直到a和b的k次根都模1同余(这意味着它们可以被1整除并且是整数)。
但是,循环运行无限。我尝试过研究,我认为这可能与精度误差有关,但我不太确定。
我尝试的另一种方法是将循环条件更改为检查a ^ {1 / k}的底部是否等于a ^ {1 / k}本身。但是,这再次无限运行,可能是由于精度误差所致。
有人知道我怎样才能解决这个问题吗?
编辑:例如,当(a,b)=(216,125)时,我希望k = 3,因为216 ^(1/3)和125 ^(1/3)都是整数(即5和6)。
这是我的代码片段,我已经添加了注释以便更好地理解:
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次根都模1同余(这意味着它们可以被1整除并且是整数)。
但是,循环运行无限。我尝试过研究,我认为这可能与精度误差有关,但我不太确定。
我尝试的另一种方法是将循环条件更改为检查a ^ {1 / k}的底部是否等于a ^ {1 / k}本身。但是,这再次无限运行,可能是由于精度误差所致。
有人知道我怎样才能解决这个问题吗?
编辑:例如,当(a,b)=(216,125)时,我希望k = 3,因为216 ^(1/3)和125 ^(1/3)都是整数(即5和6)。
1.0
进行比较,而另一个只与0
进行比较? - Tim Randall