Add solution for problem 32 in C

This commit is contained in:
daniele 2019-09-20 21:43:36 +02:00
parent e83f15c6c5
commit d573ed4254
Signed by: fuxino
GPG Key ID: 6FE25B4A3EE16FDA

129
C/p032.c Normal file
View File

@ -0,0 +1,129 @@
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include "projecteuler.h"
int compare(void *a, void *b);
int main(int argc, char **argv)
{
int a, b, i, j, k, p, p1, d, sum, n=0;
int digits[10];
int **products;
double elapsed;
struct timespec start, end;
clock_gettime(CLOCK_MONOTONIC, &start);
if((products = (int **)malloc(100*sizeof(int *))) == NULL)
{
fprintf(stderr, "Error while allocating memory\n");
return 1;
}
for(i = 0; i < 100; i++)
{
if((products[i] = (int *)malloc(sizeof(int))) == NULL)
{
fprintf(stderr, "Error while allocating memory\n");
return 1;
}
}
for(i = 2; i <= 99; i++)
{
for(j = 100; j <= 9999; j++)
{
a = i;
b = j;
p = a * b;
for(k = 0; k < 10; k++)
{
digits[k] = 0;
}
do
{
d = a % 10;
digits[d]++;
a /= 10;
}while(a > 0);
do
{
d = b % 10;
digits[d]++;
b /= 10;
}while(b > 0);
p1 = p;
do
{
d = p1 % 10;
digits[d]++;
p1 /= 10;
}while(p1 > 0);
k = 0;
if(digits[0] == 0)
{
for(k = 1; k < 10; k++)
{
if(digits[k] > 1 || digits[k] == 0)
{
break;
}
}
}
if(k == 10)
{
*products[n] = p;
n++;
}
}
}
quick_sort((void **)products, 0, 99, compare);
sum = *products[0];
for(i = 1; i < 100; i++)
{
if(*products[i] != *products[i-1])
{
sum += *products[i];
}
}
for(i = 0; i < 100; i++)
{
free(products[i]);
}
free(products);
clock_gettime(CLOCK_MONOTONIC, &end);
elapsed = (end.tv_sec - start.tv_sec) + (double)(end.tv_nsec - start.tv_nsec) / 1000000000;
printf("Project Euler, Problem 32\n");
printf("Answer: %d\n", sum);
printf("Elapsed time: %.9lf seconds\n", elapsed);
return 0;
}
int compare(void *a, void *b)
{
int *n1, *n2;
n1 = (int *)a;
n2 = (int *)b;
return *n1 - *n2;
}