Я пытаюсь вычислить два пятиугольных числа, сумма и разность которых приведут к другому пятиугольному числу. В своей основной функции я использую теорему о пятиугольном числе для получения сумм пятиугольного числа, которые производят пятиугольное число, а затем проверяю, является ли разность этих двух чисел также пятиугольной, используя функцию is_pentagonal.
Я написал следующий код на C ++ и по какой-то причине не дает правильного ответа, и я не уверен, где ошибка.
Дело в том, что когда я получаю ответ d, то j и k не пятиугольные. j и k просто превышают числовой предел, а случайные числа в конечном итоге дают пятиугольник d, и я не понимаю, почему это происходит. Спасибо.
bool is_perfect_square(int n)
{
if (n < 0) return false;
int root = sqrt(n);
return n == root * root;
}
bool is_pentagonal(int n)
{
if(is_perfect_square(24*n + 1) && (int)sqrt(24*n+1)%6 == 5)return true;
return false;
}
int main() {
int j = 0, k = 0, d = 0, n = 1;
while(!is_pentagonal(d))
{
j = (3*n+1)*(3*(3*n+1)-1)/2;
k = (n*(9*n+5)/2)*(3*n*(9*n+5)/2-1)/2;
d = k - j;
++n;
}
cout << d << endl;
return 0;
}
Я запустил этот код в Ideone:
#include <iostream>
#include <math.h>
using namespace std;
bool is_perfect_square(unsigned long long int n);
bool is_pentagonal(unsigned long long int n);int main() {
// I was just verifying that your functions are correct
/*
for (int i=0; i<100; i++) {
cout << "Number " << i << " is pentagonal? " << is_pentagonal(i) << endl;
}
*/
unsigned long long int j = 0, k = 0, d = 0;
int n = 1;
while(!is_pentagonal(d))
{
j = (3*n+1)*(3*(3*n+1)-1)/2;
if (!is_pentagonal(j)) {
cout << "Number j = " << j << " is not pentagonal; n = " << n << endl;
}
k = (n*(9*n+5)/2)*(3 *n*(9*n+5)/2-1)/2;
if (!is_pentagonal(k)) {
cout << "Number k = " << k << " is not pentagonal; n = " << n << endl;
}
d = k - j;
++n;
}
cout << "D = |k-j| = " << d << endl;
return 0;
}
bool is_perfect_square(unsigned long long int n) {
if (n < 0)
return false;
unsigned long long int root = sqrt(n);
return n == root * root;
}
bool is_pentagonal(unsigned long long int n)
{
if(is_perfect_square(24*n + 1) && (1+(unsigned long long int)sqrt(24*n+1))%6 == 0)return true;
return false;
}
И результат:
Number k = 18446744072645291725 is not pentagonal; n = 77
Number k = 18446744072702459675 is not pentagonal; n = 78
Number k = 18446744072761861113 is not pentagonal; n = 79
...
Если сравнить эти числа с 2 ^ 64 = 18 446 744 073 709 551 616, как сообщается на cplusplus.com вы заметите, что вы очень близки к этому. Итак, в основном получается, что ваш алгоритм верен, но числа быстро становятся настолько большими, что переполняются, а затем они просто ошибаются. Увидеть Вот чтобы проверить, какие варианты у вас есть сейчас.