diff --git a/27 b/27 index 64e6890..4cf351d 100755 Binary files a/27 and b/27 differ diff --git a/27.c b/27.c new file mode 100644 index 0000000..106f910 --- /dev/null +++ b/27.c @@ -0,0 +1,98 @@ +#include +#include +#include + +bool isPrime (int n) { + switch (n) { + case 1: + case 9: + return false; + case 2: + case 3: + case 5: + case 7: + return true; + default: + break; + } + + switch (n % 10) { + case 0: + case 2: + case 4: + case 5: + case 6: + case 8: + return false; + default: + if ((n + 1) % 2 != 0) + return false; + for (int i = 3; i * i <= n; i += 2) { + if (n % i == 0) + return false; + } + return true; + } +} + +bool* primeTable; + +void findPrimes (int n) { + primeTable = malloc (sizeof (bool) * (n + 1)); + for (int i = 0; i <= n; i++) + primeTable[i] = isPrime (i); +} + +int numOfPrimes (int a, int b) { + for (int n = 0; n < b; n++) { + int val = n * n + a * n + b; + if (val < 0) + val = -val; + if (primeTable[val] == false) + return n; + } +} + +int main (int argc, char* argv[]) { + int maxVal = 999 * 999 + 999 * 999 + 1000; + findPrimes (maxVal); + + int bestA = 0; + int bestB = 0; + int bestNum = 0; + for (int a = 0; a < 1000; a++) { + for (int b = 0; b <= 1000; b++) { + if (primeTable[b] == true) { + int n = numOfPrimes (a, b); + if (n > bestNum) { + bestNum = n - 1; + bestA = a; + bestB = b; + } + + n = numOfPrimes (a, -b); + if (n > bestNum) { + bestNum = n; + bestA = a; + bestB = -b; + } + + n = numOfPrimes (-a, b); + if (n > bestNum) { + bestNum = n; + bestA = -a; + bestB = b; + } + + n = numOfPrimes (-a, -b); + if (n > bestNum) { + bestNum = n; + bestA = -a; + bestB = -b; + } + } + } + } + + printf ("a: %d, b: %d, n: %d, a*b: %d", bestA, bestB, bestNum, bestA * bestB); +}