C++ 求两个五边形数,其和与差产生五边形数

C++ 求两个五边形数,其和与差产生五边形数,c++,number-theory,C++,Number Theory,我试图计算两个五边形数,它们的和和和差会产生另一个五边形数。在我的主函数中,我使用五边形数定理生成五边形数和,生成一个五边形数,然后使用is_五边形函数检查这两个数的差是否也是五边形的 我在C++中写了下面的代码,由于某种原因,它没有给出正确的答案,我不确定错误在哪里。 问题是,当我得到答案d时,j和k不是五边形的。j和k只是超过了数值极限,随机数最终会产生五边形d,我不明白为什么会发生。多谢各位 bool is_perfect_square(int n) { if (n &l

我试图计算两个五边形数,它们的和和和差会产生另一个五边形数。在我的主函数中,我使用五边形数定理生成五边形数和,生成一个五边形数,然后使用is_五边形函数检查这两个数的差是否也是五边形的

我在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;
}
bool是完美的正方形(int n)
{
如果(n<0)返回false;
int root=sqrt(n);
返回n==根*根;
}
布尔是五边形的(整数n)
{
if(is_perfect_square(24*n+1)&(int)sqrt(24*n+1)%6==5)返回true;
返回false;
}
int main(){
int j=0,k=0,d=0,n=1;
而(!是_五边形(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;
}

我已经在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;
}

如果您将这些数字与上报告的2^64=18 446 744 073 709 551 616进行比较,您会发现您与之非常接近。因此,基本上发生的情况是,您的算法是正确的,但数字很快就会溢出,然后它们就错了。请查看您现在有哪些选项。

您说的是“和与差”但我没有看到任何求和的检查。根据五边形数定理,j+k将产生一个五边形数。所以我需要检查的只是一个差。我检查了有效性j+k,结果很好,所以我很确定问题不在那一点。你期望的答案是什么?你输出的d不是五边形数吗?@Tony W当我得到我的答案时,d是五边形的,但j和k不是。j和k只是超过了数值极限,随机数最终产生了五边形的d,我不明白为什么会这样。我检查了j和k是否是五边形的,直到数值极限,并且它们每次都是五边形的。好的。那么,你确定有可能找到两个这样的n吗umbers?如果是,你确定你用你的定理跨越了所有可能的对吗?我在网上查到了答案,k的值应该只有7042750。@安德鲁,那么在这种情况下,j和k是如何生成的?它们是按你的方法生成的吗?还是以不同的方式生成的?也许你的k公式只生成了一些可能的值,并且您正在跳过一些-包括您想要查找的值。我刚刚检查过,对于
n=21
您得到
k=6223035
(小于7042750),对于
n=22
您得到
k=7478317
(大于7042750),因此您确实跳过了一些数字。
Number k = 18446744072645291725 is not pentagonal; n = 77
Number k = 18446744072702459675 is not pentagonal; n = 78
Number k = 18446744072761861113 is not pentagonal; n = 79
...