【问题标题】:Finding 2 pentagonal numbers whose sum and difference produce pentagonal number找到 2 个五边形数,其和和差产生五边形数
【发布时间】:2015-04-26 14:52:48
【问题描述】:

我正在尝试计算两个五边形数,它们的和和差将产生另一个五边形数。在我的主要函数中,我使用五边形数定理来产生五边形数和,从而产生一个五边形数,然后我使用 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;
}

【问题讨论】:

  • 您说“和差”,但我没有看到任何总和检查。
  • j+k 将根据五边形数定理产生一个五边形数。所以我需要检查的是差异。我检查了有效性 j+k 并且工作正常,所以我很确定问题不在那个位。
  • 您期待的答案是什么?你输出的 d 不是五边形数字吗?
  • @Tony 当我得到答案时,d 是五边形,但 j 和 k 不是。 j 和 k 只是超过了数值限制,随机数最终会产生五边形 d,我不明白为什么会发生这种情况。我检查了 j 和 k 是否是五边形到一个数值极限并且它们每次都是五边形。
  • 好的。那么,你确定有可能找到两个这样的数字吗?如果是,你确定你的定理跨越了所有可能的对吗?

标签: c++ number-theory


【解决方案1】:

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

如果您将这些数字与cplusplus.com 报告的 2^64 = 18 446 744 073 709 551 616 进行比较,您会发现非常接近。所以基本上发生的事情是你的算法是正确的,但是数字很快变得如此之大以至于溢出,然后它们就是错误的。请参阅 here 以查看您现在有哪些选择。

【讨论】:

  • 我在网上查了答案,k的值应该只有7042750。
  • @Andrew 在这种情况下如何生成 j 和 k ?它们是在你做的时候生成的吗?还是它们以不同的方式生成?也许你的 k 公式只生成了一些可能的值,而你跳过了一些 - 包括你想要找到的那个。
  • 我刚刚检查过,n = 21 得到 k = 6223035(小于 7042750),n = 22 得到 k = 7478317(大于 7042750)所以你肯定跳过了一些数字。跨度>
猜你喜欢
  • 2011-11-11
  • 1970-01-01
  • 1970-01-01
  • 2016-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-20
  • 2016-03-27
相关资源
最近更新 更多