diff --git a/C/p029.c b/C/p029.c index 068a95b..277ffad 100644 --- a/C/p029.c +++ b/C/p029.c @@ -2,24 +2,40 @@ #include #include #include +#include "projecteuler.h" -void selection_sort(mpz_t *v, int n); +int compare(void *a, void *b); int main(int argc, char **argv) { mpz_t a; - mpz_t powers[9801]; + mpz_t **powers; int i, j, count; double elapsed; struct timespec start, end; clock_gettime(CLOCK_MONOTONIC, &start); + if((powers = (mpz_t **)malloc(9801*sizeof(mpz_t *))) == NULL) + { + fprintf(stderr, "Error while allocating memory\n"); + return 1; + } + + for(i = 0; i < 9801; i++) + { + if((powers[i] = (mpz_t *)malloc(sizeof(mpz_t))) == NULL) + { + fprintf(stderr, "Error while allocating memory\n"); + return 1; + } + } + mpz_init(a); for(i = 0; i < 9801; i++) { - mpz_init(powers[i]); + mpz_init(*powers[i]); } for(i = 2; i <= 100; i++) @@ -27,18 +43,18 @@ int main(int argc, char **argv) mpz_set_ui(a, i); for(j = 2; j <= 100; j++) { - mpz_pow_ui(powers[(i-2)*99+j-2], a, j); + mpz_pow_ui(*powers[(i-2)*99+j-2], a, j); } } mpz_clear(a); - selection_sort(powers, 9801); + quick_sort((void **)powers, 0, 9800, compare); count = 1; for(i = 1; i < 9801; i++) { - if(mpz_cmp(powers[i], powers[i-1])) + if(mpz_cmp(*powers[i], *powers[i-1])) { count++; } @@ -46,9 +62,12 @@ int main(int argc, char **argv) for(i = 0; i < 9801; i++) { - mpz_clear(powers[i]); + mpz_clear(*powers[i]); + free(powers[i]); } + free(powers); + clock_gettime(CLOCK_MONOTONIC, &end); elapsed = (end.tv_sec - start.tv_sec) + (double)(end.tv_nsec - start.tv_nsec) / 1000000000; @@ -61,27 +80,12 @@ int main(int argc, char **argv) return 0; } -void selection_sort(mpz_t *v, int n) +int compare(void *a, void *b) { - int i, j, min; - mpz_t tmp; + mpz_t *n1, *n2; - mpz_init(tmp); + n1 = (mpz_t *)a; + n2 = (mpz_t *)b; - for(i = 0; i < n - 1; i++) - { - min = i; - - for(j = i + 1; j < n; j++) - { - if(mpz_cmp(v[j], v[min])<0) - { - min = j; - } - } - - mpz_set(tmp, v[min]); - mpz_set(v[min], v[i]); - mpz_set(v[i], tmp); - } + return mpz_cmp(*n1, *n2); } diff --git a/C/p038.c b/C/p038.c index b58eb70..1cb8818 100644 --- a/C/p038.c +++ b/C/p038.c @@ -1,8 +1,7 @@ #include #include #include - -int is_pandigital(int value, int n); +#include "projecteuler.h" int main(int argc, char **argv) { @@ -52,7 +51,7 @@ int main(int argc, char **argv) clock_gettime(CLOCK_MONOTONIC, &end); - elapsed=(end.tv_sec-start.tv_sec)+(double)(end.tv_nsec-start.tv_nsec)/1000000000; + 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); @@ -62,46 +61,3 @@ int main(int argc, char **argv) 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/p040.c b/C/p040.c index 6908e75..328bdca 100644 --- a/C/p040.c +++ b/C/p040.c @@ -68,7 +68,7 @@ int main(int argc, char **argv) clock_gettime(CLOCK_MONOTONIC, &end); - elapsed=(end.tv_sec-start.tv_sec)+(double)(end.tv_nsec-start.tv_nsec)/1000000000; + 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); diff --git a/C/projecteuler.c b/C/projecteuler.c index 363b01f..e43f175 100644 --- a/C/projecteuler.c +++ b/C/projecteuler.c @@ -1,3 +1,4 @@ +#include #include #include #include "projecteuler.h" @@ -226,3 +227,67 @@ int is_palindrome(int num, int base) 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; + if(digit > n) + { + return 0; + } + 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; +} + +int is_pentagonal(long int n) +{ + double i; + + i = (sqrt(24*n+1) + 1) / 6; + + if(i == (int)i) + { + return 1; + } + else + { + return 0; + } +} diff --git a/C/projecteuler.h b/C/projecteuler.h index c713906..34c50be 100644 --- a/C/projecteuler.h +++ b/C/projecteuler.h @@ -5,10 +5,12 @@ int is_prime(long int); long int lcmm(long int *values, int n); long int lcm(long int a, long int b); long int gcd(long int a, long int b); -int is_palindrome(int num, int base); int *sieve(int n); int count_divisors(int n); void insertion_sort(void **array, int l, int r, int (*cmp)(void *lv, void *rv)); void quick_sort(void **array, int l, int r, int (*cmp)(void *lv, void *rv)); +int is_palindrome(int num, int base); +int is_pandigital(int value, int n); +int is_pentagonal(long int n); #endif diff --git a/Python/p003.py b/Python/p003.py index 7fcd8f9..b7adcbf 100644 --- a/Python/p003.py +++ b/Python/p003.py @@ -1,6 +1,6 @@ #!/usr/bin/python3 -import math +from math import floor, sqrt from timeit import default_timer from projecteuler import is_prime @@ -13,7 +13,7 @@ def max_prime_factor(num): return max_prime_factor(num // 2) else: - limit = math.floor(math.sqrt(num)) + 1 + limit = floor(sqrt(num)) + 1 for i in range(3, limit, 2): if num % i == 0: diff --git a/Python/p008.py b/Python/p008.py index b046f80..08e5cf2 100644 --- a/Python/p008.py +++ b/Python/p008.py @@ -33,8 +33,8 @@ def main(): curr = number[i:i+13] prod = 1 - for j in range(len(curr)): - prod = prod * curr[j] + for j in curr: + prod = prod * j if prod > max_: max_ = prod diff --git a/Python/p010.py b/Python/p010.py index b0e214f..9b51251 100644 --- a/Python/p010.py +++ b/Python/p010.py @@ -10,7 +10,7 @@ def main(): sum_ = 0 for i in range(2000000): - if primes[i]: + if primes[i] == 1: sum_ = sum_ + i end = default_timer() diff --git a/Python/p016.py b/Python/p016.py index 3e26f19..8b387fe 100644 --- a/Python/p016.py +++ b/Python/p016.py @@ -9,8 +9,8 @@ def main(): sum_ = 0 - for i in range(len(res)): - sum_ = sum_ + int(res[i]) + for i in res: + sum_ = sum_ + int(i) end = default_timer() diff --git a/Python/p018.py b/Python/p018.py index 180b606..97fdd47 100644 --- a/Python/p018.py +++ b/Python/p018.py @@ -31,7 +31,9 @@ def main(): fp.close() - for i in range(len(triang)): + l = len(triang) + + for i in range(l): triang[i] = list(map(int, triang[i])) max_ = 0 diff --git a/Python/p020.py b/Python/p020.py index 5ec0692..ab52d1f 100644 --- a/Python/p020.py +++ b/Python/p020.py @@ -11,8 +11,8 @@ def main(): sum_ = 0 - for i in range(len(n)): - sum_ = sum_ + int(n[i]) + for i in n: + sum_ = sum_ + int(i) end = default_timer() diff --git a/Python/p021.py b/Python/p021.py index 08444ad..0ea5b61 100644 --- a/Python/p021.py +++ b/Python/p021.py @@ -1,11 +1,11 @@ #!/usr/bin/python3 -import math +from math import floor, sqrt from timeit import default_timer def sum_of_divisors(n): - limit = math.floor(math.sqrt(n)) + 1 + limit = floor(sqrt(n)) + 1 sum_ = 1 diff --git a/Python/p022.py b/Python/p022.py index 09f7128..2897fed 100644 --- a/Python/p022.py +++ b/Python/p022.py @@ -15,14 +15,16 @@ def main(): names.sort() sum_ = 0 + i = 1 - for i in range(len(names)): - l = len(names[i]) + for name in names: + l = len(name) score = 0 for j in range(l): - score = score + ord(names[i][j]) - ord('A') + 1 - score = score * (i + 1) + score = score + ord(name[j]) - ord('A') + 1 + score = score * i sum_ = sum_ + score + i = i + 1 end = default_timer() diff --git a/Python/p023.py b/Python/p023.py index 6ffc2ff..f731eef 100644 --- a/Python/p023.py +++ b/Python/p023.py @@ -1,11 +1,11 @@ #!/usr/bin/python3 -import math +from math import floor, sqrt from timeit import default_timer def is_abundant(n): - limit = math.floor(math.sqrt(n)) + 1 + limit = floor(sqrt(n)) + 1 sum_ = 1 for i in range(2, limit): diff --git a/Python/p035.py b/Python/p035.py index 83ad763..d52362e 100644 --- a/Python/p035.py +++ b/Python/p035.py @@ -7,14 +7,14 @@ def is_circular_prime(n): global primes if primes[n] == 0: - return 0 + return False tmp = n count = 0 while tmp > 0: if tmp % 2 == 0: - return 0 + return False count = count + 1 tmp = tmp // 10 @@ -22,9 +22,9 @@ def is_circular_prime(n): n = n % (10 ** (count - 1)) * 10 + n // (10 ** (count - 1)) if primes[n] == 0: - return 0 + return False - return 1 + return True def main(): start = default_timer() diff --git a/Python/p037.py b/Python/p037.py index d62558a..e2c3708 100644 --- a/Python/p037.py +++ b/Python/p037.py @@ -11,7 +11,7 @@ def is_tr_prime(n): while tmp > 0: if not is_prime(tmp): - return 0 + return False tmp = tmp // 10 i = 10 @@ -19,11 +19,11 @@ def is_tr_prime(n): while tmp != n: if not is_prime(tmp): - return 0 + return False i = i * 10 tmp = n % i - return 1 + return True def main(): start = default_timer() diff --git a/Python/p038.py b/Python/p038.py index c1f739d..01fb820 100644 --- a/Python/p038.py +++ b/Python/p038.py @@ -3,30 +3,7 @@ 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 +from projecteuler import is_pandigital def main(): start = default_timer() diff --git a/Python/projecteuler.py b/Python/projecteuler.py index 1a8a6ed..cb58e7b 100644 --- a/Python/projecteuler.py +++ b/Python/projecteuler.py @@ -1,22 +1,23 @@ #!/usr/bin/python3 -import math -from numpy import ndarray +from math import sqrt, floor + +from numpy import ndarray, zeros def is_prime(num): if num < 4: return num == 2 or num == 3 if num % 2 == 0 or num % 3 == 0: - return 0 + return False - limit = math.floor(math.sqrt(num)) + 1 + limit = floor(sqrt(num)) + 1 for i in range(5, limit, 6): if num % i == 0 or num % (i + 2) == 0: - return 0 + return False - return 1 + return True def gcd(a, b): if b == 0: @@ -48,7 +49,7 @@ def sieve(n): primes[i] = 0 primes[i+1] = 1 - limit = math.floor(math.sqrt(n)) + limit = floor(sqrt(n)) for i in range(3, limit, 2): if primes[i]: @@ -59,7 +60,7 @@ def sieve(n): def count_divisors(n): count = 0 - limit = math.floor(math.sqrt(n)) + limit = floor(sqrt(n)) for i in range(1, limit): if n % i == 0: @@ -81,6 +82,37 @@ def is_palindrome(num, base): tmp = tmp // base if num == reverse: - return 1 + return True + + return False + +def is_pandigital(value, n): + i = 0 + digits = zeros(n + 1, int) + + while i < n and value > 0: + digit = value % 10 + if digit > n: + return False + digits[digit] = digits[digit] + 1 + value = value // 10 + i = i + 1 + + if i < n or value > 0: + return False + + if digits[0] != 0: + return False + + for i in range(1, n+1): + if digits[i] != 1: + return False + i = i + 1 + + return True + +def is_pentagonal(n): + i = (sqrt(24*n+1) + 1) / 6 + + return i.is_integer() - return 0