找到 2 个五边形数,其总和和差产生五边形数
Finding 2 pentagonal numbers whose sum and difference produce pentagonal number
我正在尝试计算两个五边形数,其总和和差将产生另一个五边形数。在我的主函数中,我使用五边形数定理来产生产生五边形数的五边形数和,然后我使用函数检查这两个数字的差是否也是五边形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 61 cplusplus.com 6 进行比较,您会发现您非常接近这个数字。所以基本上发生的事情是你的算法是正确的,但数字很快就会变得如此之大以至于溢出,然后他们就是错误的。请参阅此处以检查您现在拥有的选项。
相关文章:
- 给定n个元素的m个集合.在C++中找到出现在最大集合数中的元素
- 在Linux中哪里可以找到互斥、未来等的源代码
- cmake如何在fedora工作站中找到boost静态库包
- 芬威克树(BIT).找到具有给定累积频率的最小索引,单位为 O(logN)
- 无法找到/读取配置文件.conf-FileIOException
- 如何找到锁定Linux futex的C++行
- 如何找到大小'x'数组是否完全填充,在C++?
- libssh 的函数在构建 libssh 时无法在 Qt 和 cmake 错误中找到
- 如何在数组中找到字符串的长度
- 找到两对数字,使它们的乘积的绝对差最小化
- 如何在c++程序中找到函数的地址
- 如何找到2个单链表的公共节点
- 给定一个向量,如何找到该向量的所有子集和的原始索引
- 如何从棋盘上的箱号中找到行和列
- 有没有可能有一个只有ADL才能找到的非好友功能
- f2、f3、f4标识符未找到
- 有没有一种"cleaner"的方法可以在指向基的指针向量中找到派生类的第一个实例?
- 如何在C++中找到active directory中禁用和锁定的窗口帐户
- 如何通过Conan和CMake找到用于pkg配置的.pc文件
- 找到 2 个五边形数,其总和和差产生五边形数