Improve code
This commit is contained in:
parent
cac80478da
commit
9db44b9d1f
58
C/p029.c
58
C/p029.c
@ -2,24 +2,40 @@
|
||||
#include <stdlib.h>
|
||||
#include <time.h>
|
||||
#include <gmp.h>
|
||||
#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);
|
||||
}
|
||||
|
48
C/p038.c
48
C/p038.c
@ -1,8 +1,7 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <time.h>
|
||||
|
||||
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;
|
||||
}
|
||||
|
2
C/p040.c
2
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);
|
||||
|
@ -1,3 +1,4 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <math.h>
|
||||
#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;
|
||||
}
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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:
|
||||
|
@ -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
|
||||
|
@ -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()
|
||||
|
@ -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()
|
||||
|
||||
|
@ -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
|
||||
|
@ -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()
|
||||
|
||||
|
@ -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
|
||||
|
||||
|
@ -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()
|
||||
|
||||
|
@ -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):
|
||||
|
@ -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()
|
||||
|
@ -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()
|
||||
|
@ -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()
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user