-1

I have been working on Project Euler lately. I am programming in C and have a query related to Problem 8. The question is:

Find the greatest product of five consecutive digits in the 1000-digit number.

73167176531330624919225119674426574742355349194934
96983520312774506326239578318016984801869478851843
85861560789112949495459501737958331952853208805511
12540698747158523863050715693290963295227443043557
66896648950445244523161731856403098711121722383113
62229893423380308135336276614282806444486645238749
30358907296290491560440772390713810515859307960866
70172427121883998797908792274921901699720888093776
65727333001053367881220235421809751254540594752243
52584907711670556013604839586446706324415722155397
53697817977846174064955149290862569321978468622482
83972241375657056057490261407972968652414535100474 
82166370484403199890008895243450658541227588666881
16427171479924442928230863465674813919123162824586
17866458359124566529476545682848912883142607690042
24219022671055626321111109370544217506941658960408
07198403850962455444362981230987879927244284909188
84580156166097919133875499200524063689912560717606
05886116467109405077541002256983155200055935729725
71636269561882670428252483600823257530420752963450

Here is my own done work yet:

#include <stdio.h>
#include <string.h>

int main(void)
{
    char *string = "731671765313306249192251196744.............";
    char *x;
    x = string;
    for(int counter = 0;counter < 2;counter++)
    {
        printf("%s\n", x + strlen(x) - 5);
        x = x + strlen(x) - 5;
    }
}

SO, the problem is that unable to understand what to do next. I am able to extract the digits, but what would be the algorithm to use these digits and create an algorithm thats fast and efficient. So, any help, please! Another problem is that when I try to convert the char to an int value, it fails and gives the error "error: incompatible pointer to integer conversion initializing 'char' with an expression of type'char[1001]'. I have used the methods to convert values as here:Coversion of char to int, and so thats it. If any more suggestions, please suggest the better things...

Community
  • 1
  • 1
  • 2
    Do you really expect that converting a 1000-digits string to `int` gives you that same integer? Why are you going through Project Euler exercises to come here and ask for the algorithm? The point of the challenge is to design it on your own. – Filipe Gonçalves Apr 04 '14 at 12:05
  • Well, then @FilipeGonçalves, what do I do next – user3497878 Apr 04 '14 at 12:06
  • Find a better representation. E.g., you might want to use an array of unsigned char instead, and store each digit into each position. Don't store it as a string - store it as a byte array. Then just make a loop that looks at the next 5 positions and multiplies them, storing the max. result seen so far. – Filipe Gonçalves Apr 04 '14 at 12:08
  • You're obviously new to the C language. Like most new language exposures you should be considering an algorithm, then marrying that with what the language (and its runtime library if such a thing exists, and it does here) has to offer to implement that algorithm. In order to do *that* you have to become familiar with the language basics and its most common library functions. That said, there are *numerous* solutions to Euler questions posted on this forum, including this one. But I don't advise seeking those out until you put more effort into solving this yourself first. – WhozCraig Apr 04 '14 at 12:12
  • Ya WhozCraig, i'm kinda new for C but yeah what @FilipeGonçalves says makes sense, so can you present your algorithm for helping me out – user3497878 Apr 04 '14 at 12:16
  • If you want to cheat yourself out of the thrill (and intended purpose) of actually solving this or any other euler, code chef, or similar coding problem site problem, the answers you seek are no further than searching for "[c] Euler 8" on this site, but as i said, I don't advise it. – WhozCraig Apr 04 '14 at 12:20
  • @user3497878: First of all indent your code. – Jabberwocky Apr 04 '14 at 12:21
  • "what do I do next" -- You think it through. Notably, your code, which is useless junk, contains no multiplication, no loop over 5 elements, no determining of max values, nothing at all germane to the problem. "have used the methods to convert values as here" -- No, I'm sure you haven't. – Jim Balter Apr 08 '14 at 23:23
  • "you might want to use an array of unsigned char instead, and store each digit into each position. Don't store it as a string - store it as a byte array. " -- There's no need for any of that. – Jim Balter Apr 08 '14 at 23:26

1 Answers1

0

You can read the characters in the string, convert them to integers and then find their product to check which group of 5 consecutive integers give the highest product. At the loss of fun and learning that you can have trying to do it yourself, you can try this.

#include <stdio.h>
#include <string.h>

// calculates the product of a group of numeric chars
// after converting them to int type
int gproduct(char *s, int glen) {
    int i = 0;
    int val = 1;

    // convert a numeric char to int value by subtracting '0'
    // assuming the chars are encoded in ascii. consider using
    // the standard library function atoi for portability.
    while(i < glen)
        val *= (s[i++] - '0');  

    return val;
}

int main(void) {
    char *numstr = "731671765313306249192251196744.............";
    int glen = 5;  // group length
    int maxcount = strlen(numstr) - glen;  
    int maxval = gproduct(numstr, glen);  // initialize maxval
    int tempval;
    for(int i = 1; i < maxcount; i++) {
        tempval = gproduct(numstr + i, glen);
        if(tempval > maxval) 
            maxval = tempval;  
    }
    printf("%d\n", maxval);
    return 0;
}   
ajay
  • 9,402
  • 8
  • 44
  • 71