Add more solutions

Added solutions for problems 36, 37, 38, 39 and 40 in python and C
This commit is contained in:
2019-09-21 15:45:18 +02:00
parent 4e6b5c774f
commit cac80478da
10 changed files with 626 additions and 0 deletions

32
C/p036.c Normal file
View File

@ -0,0 +1,32 @@
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#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;
}

73
C/p037.c Normal file
View File

@ -0,0 +1,73 @@
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
#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;
}

107
C/p038.c Normal file
View File

@ -0,0 +1,107 @@
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
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;
}

74
C/p039.c Normal file
View File

@ -0,0 +1,74 @@
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
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;
}

79
C/p040.c Normal file
View File

@ -0,0 +1,79 @@
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
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;
}