Я пишу программу, которая пытается найти минимальное значение k> 1 так, чтобы k-й корень a и b (которые оба заданы) равнялся целому числу.
Вот фрагмент моего кода, который я прокомментировал для пояснения.
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 до тех пор, пока k-е корни a и b не будут конгруэнтны 0 0 1 (это означает, что они делятся на 1 и, таким образом, целые числа).
Но цикл работает бесконечно. Я пытался исследовать, и я думаю, что это может быть связано с ошибкой точности; однако я не слишком уверен.
Другой подход, который я попробовал, - это изменить условие цикла, чтобы проверить, равен ли пол ^ {1 / k} самому ^ {1 / k}. Но опять же, это происходит бесконечно, вероятно из-за ошибки точности.
Кто-нибудь знает, как я могу решить эту проблему?
РЕДАКТИРОВАТЬ: например, когда (a, b) = (216, 125), я хочу, чтобы k = 3, потому что 216 ^ (1/3) и 125 ^ (1/3) оба целые числа (а именно, 5 и 6).