三角形数、五边形数和六角形数分别由以下公式给出:
三角形数 Tn=n(n+1)/2 1, 3, 6, 10, 15, …
五边形数 Pn=n(3n−1)/2 1, 5, 12, 22, 35, …
六边形数 Hn=n(2n−1) 1, 6, 15, 28, 45, …
可以验证,T285 = P165 = H143 = 40755。
找出下一个同时是三角形数、五边形数和六角形数的数。
#include <stdio.h>
#include <inttypes.h>
int64_t Triangle(int64_t n) {
return n * (n + 1) >> 1;
}
int64_t Pentagonal(int64_t n) {
return n * (3 * n - 1) >> 1;
}
int64_t Hexagonal(int64_t n) {
return n * (2 * n - 1);
}
int64_t binary_search(int64_t (*arr)(int64_t), int64_t n, int64_t x) {
int64_t head = 1, tail = n, mid;
while (head <= tail) {
mid = (head + tail) >> 1;
if (arr(mid) == x) return mid;
if (arr(mid) < x) head = mid + 1;
else tail = mid - 1;
}
return 0;
}
int main() {
int64_t n = 143;
while (1) {
n++;
int64_t temp = Hexagonal(n);
if (!binary_search(Pentagonal, temp, temp)) continue;
printf("%lld\n", temp);
break;
}
return 0;
}