Improve code

This commit is contained in:
2019-09-22 10:33:18 +02:00
parent cac80478da
commit 9db44b9d1f
18 changed files with 174 additions and 134 deletions

View File

@ -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);
}

View File

@ -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;
}

View File

@ -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);

View File

@ -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;
}
}

View File

@ -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