From cac80478da69c4dd71e13e4d8799cb4fd312d0a2 Mon Sep 17 00:00:00 2001 From: Daniele Fucini Date: Sat, 21 Sep 2019 15:45:18 +0200 Subject: [PATCH] Add more solutions Added solutions for problems 36, 37, 38, 39 and 40 in python and C --- C/p036.c | 32 +++++++++++++++ C/p037.c | 73 +++++++++++++++++++++++++++++++++ C/p038.c | 107 +++++++++++++++++++++++++++++++++++++++++++++++++ C/p039.c | 74 ++++++++++++++++++++++++++++++++++ C/p040.c | 79 ++++++++++++++++++++++++++++++++++++ Python/p036.py | 23 +++++++++++ Python/p037.py | 49 ++++++++++++++++++++++ Python/p038.py | 69 +++++++++++++++++++++++++++++++ Python/p039.py | 60 +++++++++++++++++++++++++++ Python/p040.py | 60 +++++++++++++++++++++++++++ 10 files changed, 626 insertions(+) create mode 100644 C/p036.c create mode 100644 C/p037.c create mode 100644 C/p038.c create mode 100644 C/p039.c create mode 100644 C/p040.c create mode 100644 Python/p036.py create mode 100644 Python/p037.py create mode 100644 Python/p038.py create mode 100644 Python/p039.py create mode 100644 Python/p040.py diff --git a/C/p036.c b/C/p036.c new file mode 100644 index 0000000..1acc064 --- /dev/null +++ b/C/p036.c @@ -0,0 +1,32 @@ +#include +#include +#include +#include "projecteuler.h" + +int main(int argc, char **argv) +{ + int i, sum = 0; + double elapsed; + struct timespec start, end; + + clock_gettime(CLOCK_MONOTONIC, &start); + + for(i = 1; i < 1000000; i += 2) + { + if(is_palindrome(i, 10) && is_palindrome(i, 2)) + { + sum += i; + } + } + + clock_gettime(CLOCK_MONOTONIC, &end); + + elapsed = (end.tv_sec - start.tv_sec) + (double)(end.tv_nsec - start.tv_nsec) / 1000000000; + + printf("Project Euler, Problem 36\n"); + printf("Answer: %d\n", sum); + + printf("Elapsed time: %.9lf seconds\n", elapsed); + + return 0; +} diff --git a/C/p037.c b/C/p037.c new file mode 100644 index 0000000..bab5d83 --- /dev/null +++ b/C/p037.c @@ -0,0 +1,73 @@ +#include +#include +#include +#include +#include "projecteuler.h" + +int is_tr_prime(int n); + +int main(int argc, char **argv) +{ + int i = 0, n = 1, sum = 0; + double elapsed; + struct timespec start, end; + + clock_gettime(CLOCK_MONOTONIC, &start); + + while(i < 11) + { + if(is_tr_prime(n)) + { + sum += n; + i++; + } + n++; + } + + clock_gettime(CLOCK_MONOTONIC, &end); + + elapsed = (end.tv_sec - start.tv_sec) + (double)(end.tv_nsec - start.tv_nsec) / 1000000000; + + printf("Project Euler, Problem 37\n"); + printf("Answer: %d\n", sum); + + printf("Elapsed time: %.9lf seconds\n", elapsed); + + return 0; +} + +int is_tr_prime(int n) +{ + int i, tmp; + + if(n < 11 || !is_prime(n)) + { + return 0; + } + + tmp = n / 10; + + while(tmp > 0) + { + if(!is_prime(tmp)) + { + return 0; + } + tmp /= 10; + } + + i = 10; + tmp = n % i; + + while(tmp != n) + { + if(!is_prime(tmp)) + { + return 0; + } + i *= 10; + tmp = n % i; + } + + return 1; +} diff --git a/C/p038.c b/C/p038.c new file mode 100644 index 0000000..b58eb70 --- /dev/null +++ b/C/p038.c @@ -0,0 +1,107 @@ +#include +#include +#include + +int is_pandigital(int value, int n); + +int main(int argc, char **argv) +{ + int i, j, tmp; + long int n, max = 0; + double elapsed; + struct timespec start, end; + + clock_gettime(CLOCK_MONOTONIC, &start); + + for(i = 1; i < 10000; i++) + { + n = 0; + j = 1; + do + { + tmp = i * j; + n += tmp; + j++; + + if(n > max && is_pandigital(n, 9)) + { + max = n; + } + if(i * j < 10) + { + n *= 10; + } + else if(i * j < 100) + { + n *= 100; + } + else if(i * j < 1000) + { + n *= 1000; + } + else if(i * j < 10000) + { + n *= 10000; + } + else if(i * j < 100000) + { + n *= 100000; + } + }while(n <= 987654321); + } + + clock_gettime(CLOCK_MONOTONIC, &end); + + elapsed=(end.tv_sec-start.tv_sec)+(double)(end.tv_nsec-start.tv_nsec)/1000000000; + + printf("Project Euler, Problem 38\n"); + printf("Answer: %ld\n", max); + + printf("Elapsed time: %.9lf seconds\n", elapsed); + + return 0; +} + +int is_pandigital(int value, int n) +{ + int *digits; + int i, digit; + + if((digits = (int *)calloc(n+1, sizeof(int))) == NULL) + { + fprintf(stderr, "Error while allocating memory\n"); + exit(1); + } + + for(i = 0; i < n && value > 0; i++) + { + digit = value % 10; + digits[digit]++; + value /= 10; + } + + if(i < n || value > 0) + { + free(digits); + return 0; + } + + if(digits[0] != 0) + { + free(digits); + return 0; + } + + for(i = 1; i <= n; i++) + { + if(digits[i] != 1) + { + free(digits); + return 0; + } + } + + free(digits); + + return 1; +} diff --git a/C/p039.c b/C/p039.c new file mode 100644 index 0000000..70d0c50 --- /dev/null +++ b/C/p039.c @@ -0,0 +1,74 @@ +#include +#include +#include + +int main(int argc, char **argv) +{ + int p, m, n, a, b, c, count, max = 0, res = 0, tmpa, tmpb, tmpc, i; + int savedc[1000] = {0}; + double elapsed; + struct timespec start, end; + + clock_gettime(CLOCK_MONOTONIC, &start); + + for(p = 12; p <= 1000; p++) + { + count = 0; + a = 0; + b = 0; + c = 0; + + for(m = 2; m * m < p; m++) + { + for(n = 1; n < m; n++) + { + a = m * m - n * n; + b = 2 * m * n; + c = m * m + n * n; + + if(a + b + c == p && !savedc[c]) + { + savedc[c] = 1; + count++; + } + + i = 2; + tmpa = a; + tmpb = b; + tmpc = c; + + while(tmpa + tmpb + tmpc < p) + { + tmpa = a * i; + tmpb = b * i; + tmpc = c * i; + + if(tmpa + tmpb + tmpc == p && !savedc[tmpc]) + { + savedc[tmpc] = 1; + count++; + } + + i++; + } + } + } + + if(count > max) + { + max = count; + res = p; + } + } + + clock_gettime(CLOCK_MONOTONIC, &end); + + elapsed = (end.tv_sec - start.tv_sec) + (double)(end.tv_nsec - start.tv_nsec) / 1000000000; + + printf("Project Euler, Problem 39\n"); + printf("Answer: %d\n", res); + + printf("Elapsed time: %.9lf seconds\n", elapsed); + + return 0; +} diff --git a/C/p040.c b/C/p040.c new file mode 100644 index 0000000..6908e75 --- /dev/null +++ b/C/p040.c @@ -0,0 +1,79 @@ +#include +#include +#include + +int main(int argc, char **argv) +{ + int i, value, n; + int digits[1000005]; + double elapsed; + struct timespec start, end; + + clock_gettime(CLOCK_MONOTONIC, &start); + + i = 1; + value = 1; + + while(i <= 1000000) + { + if(value < 10) + { + digits[i-1] = value; + i++; + } + else if(value < 100) + { + digits[i-1] = value / 10; + digits[i] = value % 10; + i += 2; + } + else if(value < 1000) + { + digits[i-1] = value / 100; + digits[i] = (value / 10) % 10; + digits[i+1] = value % 10; + i += 3; + } + else if(value < 10000) + { + digits[i-1] = value / 1000; + digits[i] = (value / 100) % 10; + digits[i+1] = (value / 10) % 10; + digits[i+2] = value % 10; + i += 4; + } + else if(value < 100000) + { + digits[i-1] = value / 10000; + digits[i] = (value / 1000) % 10; + digits[i+1] = (value / 100) % 10; + digits[i+2] = (value / 10) % 10; + digits[i+3] = value % 10; + i += 5; + } + else if(value < 1000000) + { + digits[i-1] = value / 100000; + digits[i] = (value / 10000) % 10; + digits[i+1] = (value / 1000) % 10; + digits[i+2] = (value / 100) % 10; + digits[i+3] = (value / 10) % 10; + digits[i+4] = value % 10; + i += 6; + } + value++; + } + + n = digits[0] * digits[9] * digits[99] * digits[999] * digits[9999] * digits[99999] * digits[999999]; + + clock_gettime(CLOCK_MONOTONIC, &end); + + elapsed=(end.tv_sec-start.tv_sec)+(double)(end.tv_nsec-start.tv_nsec)/1000000000; + + printf("Project Euler, Problem 40\n"); + printf("Answer: %d\n", n); + + printf("Elapsed time: %.9lf seconds\n", elapsed); + + return 0; +} diff --git a/Python/p036.py b/Python/p036.py new file mode 100644 index 0000000..746c068 --- /dev/null +++ b/Python/p036.py @@ -0,0 +1,23 @@ +#!/usr/bin/python3 + +from timeit import default_timer +from projecteuler import is_palindrome + +def main(): + start = default_timer() + + sum_ = 0 + + for i in range(1, 1000000): + if is_palindrome(i, 10) and is_palindrome(i, 2): + sum_ = sum_ + i + + end = default_timer() + + print('Project Euler, Problem 36') + print('Answer: {}'.format(sum_)) + + print('Elapsed time: {:.9f} seconds'.format(end - start)) + +if __name__ == '__main__': + main() diff --git a/Python/p037.py b/Python/p037.py new file mode 100644 index 0000000..d62558a --- /dev/null +++ b/Python/p037.py @@ -0,0 +1,49 @@ +#!/usr/bin/python3 + +from timeit import default_timer +from projecteuler import is_prime + +def is_tr_prime(n): + if n < 11 or not is_prime(n): + return False + + tmp = n // 10 + + while tmp > 0: + if not is_prime(tmp): + return 0 + tmp = tmp // 10 + + i = 10 + tmp = n % i + + while tmp != n: + if not is_prime(tmp): + return 0 + i = i * 10 + tmp = n % i + + return 1 + +def main(): + start = default_timer() + + i = 0 + n = 1 + sum_ = 0 + + while i < 11: + if is_tr_prime(n): + sum_ = sum_ + n + i = i + 1 + n = n + 1 + + end = default_timer() + + print('Project Euler, Problem 37') + print('Answer: {}'.format(sum_)) + + print('Elapsed time: {:.9f} seconds'.format(end - start)) + +if __name__ == '__main__': + main() diff --git a/Python/p038.py b/Python/p038.py new file mode 100644 index 0000000..c1f739d --- /dev/null +++ b/Python/p038.py @@ -0,0 +1,69 @@ +#!/usr/bin/python3 + +from numpy import zeros + +from timeit import default_timer + +def is_pandigital(value, n): + i = 0 + + digits = zeros(n + 1, int) + + while i < n and value > 0: + digit = value % 10 + digits[digit] = digits[digit] + 1 + value = value // 10 + i = i + 1 + + if i < n or value > 0: + return 0 + + if digits[0] != 0: + return 0 + + for i in range(1, n+1): + if digits[i] != 1: + return 0 + i = i + 1 + + return 1 + +def main(): + start = default_timer() + + max_ = 0 + + for i in range(1, 10000): + n = 0 + j = 1 + + while 1: + tmp = i * j + n = n + tmp + j = j + 1 + + if n > max_ and is_pandigital(n, 9): + max_ = n + if i * j < 10: + n = n * 10 + elif i * j < 100: + n = n * 100 + elif i * j < 1000: + n = n * 1000 + elif i * j < 10000: + n = n * 10000 + elif i * j < 100000: + n = n * 100000 + + if n > 987654321: + break + + end = default_timer() + + print('Project Euler, Problem 38') + print('Answer: {}'.format(max_)) + + print('Elapsed time: {:.9f} seconds'.format(end - start)) + +if __name__ == '__main__': + main() diff --git a/Python/p039.py b/Python/p039.py new file mode 100644 index 0000000..484b0aa --- /dev/null +++ b/Python/p039.py @@ -0,0 +1,60 @@ +#!/usr/bin/python3 + +from numpy import zeros + +from timeit import default_timer + +def main(): + start = default_timer() + + max_ = 0 + savedc = zeros(1000, int) + + for p in range(12, 1001): + count = 0 + a = 0 + b = 0 + c = 0 + m = 2 + + while m * m < p: + for n in range(1, m): + a = m * m - n * n + b = 2 * m * n + c = m * m + n * n + + if a + b + c == p and savedc[c] == 0: + savedc[c] = 1 + count = count + 1 + + i = 2 + tmpa = a + tmpb = b + tmpc = c + + while tmpa + tmpb + tmpc < p: + tmpa = a * i + tmpb = b * i + tmpc = c * i + + if tmpa + tmpb + tmpc == p and savedc[tmpc] == 0: + savedc[tmpc] = 1 + count = count + 1 + + i = i + 1 + + m = m + 1 + + if count > max_: + max_ = count + res = p + + end = default_timer() + + print('Project Euler, Problem 39') + print('Answer: {}'.format(res)) + + print('Elapsed time: {:.9f} seconds'.format(end - start)) + +if __name__ == '__main__': + main() diff --git a/Python/p040.py b/Python/p040.py new file mode 100644 index 0000000..0299e76 --- /dev/null +++ b/Python/p040.py @@ -0,0 +1,60 @@ +#!/usr/bin/python3 + +from numpy import zeros + +from timeit import default_timer + +def main(): + start = default_timer() + + digits = zeros(1000005, int) + i = 1 + value = 1 + + while i <= 1000000: + if value < 10: + digits[i-1] = value + i = i + 1 + elif value < 100: + digits[i-1] = value / 10 + digits[i] = value % 10 + i = i + 2 + elif value < 1000: + digits[i-1] = value / 100 + digits[i] = (value / 10) % 10 + digits[i+1] = value % 10 + i = i + 3 + elif value < 10000: + digits[i-1] = value / 1000 + digits[i] = (value / 100) % 10 + digits[i+1] = (value / 10) % 10 + digits[i+2] = value % 10 + i = i + 4 + elif value < 100000: + digits[i-1] = value / 10000 + digits[i] = (value / 1000) % 10 + digits[i+1] = (value / 100) % 10 + digits[i+2] = (value / 10) % 10 + digits[i+3] = value % 10 + i = i + 5 + elif value < 1000000: + digits[i-1] = value / 100000 + digits[i] = (value / 10000) % 10 + digits[i+1] = (value / 1000) % 10 + digits[i+2] = (value / 100) % 10 + digits[i+3] = (value / 10) % 10 + digits[i+4] = value % 10 + i = i + 6 + value = value + 1 + + n = digits[0] * digits[9] * digits[99] * digits[999] * digits[9999] * digits[99999] * digits[999999] + + end = default_timer() + + print('Project Euler, Problem 40') + print('Answer: {}'.format(n)) + + print('Elapsed time: {:.9f} seconds'.format(end - start)) + +if __name__ == '__main__': + main()