1
0
Fork 0
projecteuler/44.c

57 lines
1.4 KiB
C

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <math.h>
int try = 3000;
int* pentagonalTable;
int* pentagonals;
bool isPentagonal (int n) {
if (n < try && pentagonalTable[n] == -1)
return false;
if (n < try && pentagonalTable[n] == 1)
return true;
else {
int radicand = 24*n + 1;
int sqrtr = sqrt (radicand);
if (sqrtr * sqrtr == radicand && (sqrtr + 1) % 6 == 0) {
if (n < try)
pentagonalTable[n] = 1;
return true;
}
else {
if (n < try)
pentagonalTable[n] = -1;
return false;
}
}
}
int pentagonalize (int n) {
if (n < try) {
if (pentagonals[n] == 0) {
pentagonals[n] = n * (3*n - 1) / 2;
if (pentagonals[n] < try)
pentagonalTable[pentagonals[n]] = 1;
}
return pentagonals[n];
}
else
return n * (3*n - 1) / 2;
}
int main () {
pentagonalTable = calloc (try, sizeof (int));
pentagonals = calloc (try, sizeof (int));
for (int j = 1; j < try; j++) {
for (int k = 1; k < j; k++) {
int pj = pentagonalize (j);
int pk = pentagonalize (k);
if (isPentagonal (pj + pk) && isPentagonal (pj - pk)) {
printf ("j: %d; k: %d; Pj: %d; Pk: %d; D: %d", j, k, pj, pk, pj - pk);
}
}
}
}