五边形数
五边形数由公式Pn=n(3n−1)/2生成。前十个五边形数是:
1, 5, 12, 22, 35, 51, 70, 92, 117, 145, …
可以看出P4 + P7 = 22 + 70 = 92 = P8。然而,它们的差70 − 22 = 48并不是五边形数。
在所有和差均为五边形数的五边形数对Pj和Pk中,找出使D = |Pk − Pj|最小的一对;此时D的值是多少?
代码演示
#include <iostream>
#include <cinttypes>
using namespace std;
typedef long long int1;
int1 Pentagonal(int1 n) {
return n * (3 * n - 1) / 2;
}
int1 binary_search(int1 (*func)(int1), int1 n, int1 x) {
int1 head = 1, tail = n, mid;
while (head <= tail) {
mid = (head + tail) >> 1;
if (func(mid) == x) return mid;
if (func(mid) < x) head = mid + 1;
else tail = mid - 1;
}
return 0;
}
int main() {
int1 n = 2, d = INT32_MAX, pk, pj;
while (Pentagonal(n) - Pentagonal(n - 1) < d) {
pk = Pentagonal(n);
for (int1 j = n - 1; j >= 1; j--) {
pj = Pentagonal(j);
if (pk - pj >= d) break;
int flag = 1;
flag = binary_search(Pentagonal, 2 * n, pk + pj);
flag = flag && binary_search(Pentagonal, n, pk - pj);
if (flag) {
d = pk - pj;
}
}
n += 1;
}
cout << d << endl;
return 0;
}