Add more solutions

Added solutions for problems 26, 27, 28, 29 and 30, both in C
and python
This commit is contained in:
2019-09-20 14:51:51 +02:00
parent 6b29655330
commit c3804247b4
10 changed files with 464 additions and 0 deletions

66
C/p026.c Normal file
View File

@ -0,0 +1,66 @@
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
#include <gmp.h>
int main(int argc, char **argv)
{
int i, j, n, max = 0, max_n = 0;
double elapsed;
struct timespec start, end;
mpz_t k, div;
clock_gettime(CLOCK_MONOTONIC, &start);
mpz_init(k);
mpz_init(div);
for(i = 2; i < 1000; i++)
{
j = i;
while(j % 2 == 0 && j > 1)
j /= 2;
while(j % 5 == 0 && j > 1)
j /= 5;
mpz_set_ui(k, 9);
if(j == 1)
n = 0;
else
{
n = 1;
mpz_set_ui(div, j);
while(!mpz_divisible_p(k, div))
{
n++;
mpz_mul_ui(k, k, 10);
mpz_add_ui(k, k, 9);
}
if(n > max)
{
max = n;
max_n = i;
}
}
}
mpz_clears(k, div, NULL);
clock_gettime(CLOCK_MONOTONIC, &end);
elapsed=(end.tv_sec-start.tv_sec)+(double)(end.tv_nsec-start.tv_nsec)/1000000000;
printf("Project Euler, Problem 26\n");
printf("Answer: %d\n", max_n);
printf("Elapsed time: %.9lf seconds\n", elapsed);
return 0;
}

56
C/p027.c Normal file
View File

@ -0,0 +1,56 @@
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
#include "projecteuler.h"
int main(int argc, char **argv)
{
int a, b, n, p, count, max = 0, save_a, save_b;
double elapsed;
struct timespec start, end;
clock_gettime(CLOCK_MONOTONIC, &start);
for(a = -999; a < 1000; a++)
{
for(b = 2; b <= 1000; b++)
{
n = 0;
count = 0;
while(1)
{
p = n * n + a * n + b;
if(p > 1 && is_prime(p))
{
count++;
n++;
}
else
{
break;
}
}
if(count > max)
{
max = count;
save_a = a;
save_b = b;
}
}
}
clock_gettime(CLOCK_MONOTONIC, &end);
elapsed = (end.tv_sec - start.tv_sec) + (double)(end.tv_nsec - start.tv_nsec) / 1000000000;
printf("Project Euler, Problem 27\n");
printf("Answer: %d\n", save_a * save_b);
printf("Elapsed time: %.9lf seconds\n", elapsed);
return 0;
}

36
C/p028.c Normal file
View File

@ -0,0 +1,36 @@
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define N 1001
int main(int argc, char **argv)
{
int i, j, step = 0, limit = N * N, sum = 1;
double elapsed;
struct timespec start, end;
clock_gettime(CLOCK_MONOTONIC, &start);
for(i = 0, j = 1; j < limit; i = (i + 1) % 4)
{
if(i == 0)
{
step += 2;
}
j += step;
sum += j;
}
clock_gettime(CLOCK_MONOTONIC, &end);
elapsed = (end.tv_sec - start.tv_sec) + (double)(end.tv_nsec - start.tv_nsec) / 1000000000;
printf("Project Euler, Problem 28\n");
printf("Answer: %d\n", sum);
printf("Elapsed time: %.9lf seconds\n", elapsed);
return 0;
}

87
C/p029.c Normal file
View File

@ -0,0 +1,87 @@
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <gmp.h>
void selection_sort(mpz_t *v, int n);
int main(int argc, char **argv)
{
mpz_t a;
mpz_t powers[9801];
int i, j, count;
double elapsed;
struct timespec start, end;
clock_gettime(CLOCK_MONOTONIC, &start);
mpz_init(a);
for(i = 0; i < 9801; i++)
{
mpz_init(powers[i]);
}
for(i = 2; i <= 100; i++)
{
mpz_set_ui(a, i);
for(j = 2; j <= 100; j++)
{
mpz_pow_ui(powers[(i-2)*99+j-2], a, j);
}
}
mpz_clear(a);
selection_sort(powers, 9801);
count = 1;
for(i = 1; i < 9801; i++)
{
if(mpz_cmp(powers[i], powers[i-1]))
{
count++;
}
}
for(i = 0; i < 9801; i++)
{
mpz_clear(powers[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 29\n");
printf("Answer: %d\n", count);
printf("Elapsed time: %.9lf seconds\n", elapsed);
return 0;
}
void selection_sort(mpz_t *v, int n)
{
int i, j, min;
mpz_t tmp;
mpz_init(tmp);
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);
}
}

42
C/p030.c Normal file
View File

@ -0,0 +1,42 @@
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
int main(int argc, char **argv)
{
int i, j, digit, sum, sum_tot = 0;
double elapsed;
struct timespec start, end;
clock_gettime(CLOCK_MONOTONIC, &start);
for(i = 10; i < 354295; i++)
{
j = i;
sum = 0;
while(j > 0)
{
digit = j % 10;
sum += (pow(digit, 5));
j /= 10;
}
if(sum == i)
{
sum_tot += 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 30\n");
printf("Answer: %d\n", sum_tot);
printf("Elapsed time: %.9lf seconds\n", elapsed);
return 0;
}