I've solved problem #8 in Project Euler, which asks to find the 13 consecutive digits with the greatest product from a particular 1000-digit number. I would like to hear any suggestions regarding my code. My solution is not restricted to 13 digits, and the user is allowed to choose any number of digits (as long as they are less than the given data).
// Link: http://projecteuler.net/problem=8
#include <stdio.h>
#include <inttypes.h>
#define DIGITNUM 13
int char2int(const char n)
{
return n - '0';
}
uint64_t getProduct(const int num[])
{
uint64_t product = 1.0;
int i;
for (i = 0; i < DIGITNUM; ++i)
product *= (uint64_t)num[i];
return product;
}
int main()
{
char number[] = "73167176531330624919225119674426574742355349194934"
"96983520312774506326239578318016984801869478851843"
"85861560789112949495459501737958331952853208805511"
"12540698747158523863050715693290963295227443043557"
"66896648950445244523161731856403098711121722383113"
"62229893423380308135336276614282806444486645238749"
"30358907296290491560440772390713810515859307960866"
"70172427121883998797908792274921901699720888093776"
"65727333001053367881220235421809751254540594752243"
"52584907711670556013604839586446706324415722155397"
"53697817977846174064955149290862569321978468622482"
"83972241375657056057490261407972968652414535100474"
"82166370484403199890008895243450658541227588666881"
"16427171479924442928230863465674813919123162824586"
"17866458359124566529476545682848912883142607690042"
"24219022671055626321111109370544217506941658960408"
"07198403850962455444362981230987879927244284909188"
"84580156166097919133875499200524063689912560717606"
"05886116467109405077541002256983155200055935729725"
"71636269561882670428252483600823257530420752963450";
uint64_t product, max = 0.0;
int data[DIGITNUM],
i = DIGITNUM - 1;
while ( number[i] != '\0' )
{
int k = 0;
while ( k < DIGITNUM ){
data[k] = char2int(number[i-k]);
++k;
}
product = getProduct(data);
if ( product > max )
max = product;
++i;
}
printf("The max product of %d digit is: %"PRId64" \n", DIGITNUM, max);
return 0;
}