简体   繁体   中英

C Program Generates An odd output

Recently I have tried to start learning C, and decided to do some of the project Euler challenges. I wrote this code to solve the problem, however when it is run it outputs numbers that should be impossible. I have tried everything to fix it. Including making some of my ints long, none of this seems to work. Any input would be great, thanks!

#include <stdio.h>

int main(){
    char num[] = 
"73167176531330624919225119674426574742355349194934"
"96983520312774506326239578318016984801869478851843"
"85861560789112949495459501737958331952853208805511"
"12540698747158523863050715693290963295227443043557"
"66896648950445244523161731856403098711121722383113"
"62229893423380308135336276614282806444486645238749"
"30358907296290491560440772390713810515859307960866"
"70172427121883998797908792274921901699720888093776"
"65727333001053367881220235421809751254540594752243"
"52584907711670556013604839586446706324415722155397"
"53697817977846174064955149290862569321978468622482"
"83972241375657056057490261407972968652414535100474"
"82166370484403199890008895243450658541227588666881"
"16427171479924442928230863465674813919123162824586"
"17866458359124566529476545682848912883142607690042"
"24219022671055626321111109370544217506941658960408"
"07198403850962455444362981230987879927244284909188"
"84580156166097919133875499200524063689912560717606"
"05886116467109405077541002256983155200055935729725"
"71636269561882670428252483600823257530420752963450";

    int inc;
    long int next_biggest = 0;
    for (inc = 0; inc <= 986; inc++){
        int temp;
        long int total = (int)num[inc];
        for (temp = 1; temp <= 13; temp++){
            total *= (int)num[(inc + temp)];
        }
        if ((total > next_biggest)){
            next_biggest = total;
            printf("Next Biggest Number: %ld\n", total);
        }
    }
}

The line

long int total = (int)num[inc];

looks like it converts '3' into an int 3, but it does not. What it does is it takes the ASCII value of the '3' and assigns it to your int .

Fix it and your program would run fine :)

long int total = num[inc] - '0';

Essentially what is happening here is we get a char value (which is a digit) and get its ASCII code. Then, based on the fact that in ASCII all the digits are in one contiguous block of values that begins with '0' we calculate the face value of that digits and use it as an int .

Here's the output of your program once the above line is corrected:

Next Biggest Number: 2032807552
Next Biggest Number: 2084481664
Next Biggest Number: 2141716480
Next Biggest Number: 2144206848

You can use atoi(), atol() eg.. to convert a char or array or chars to a single int or long type.

http://www.cplusplus.com/reference/cstdlib/atoi/

You can do it like this and it will work:

#include <stdio.h>
#include <stdlib.h>

char buffer[256] = {"123456"};
char i = buffer[3];
printf("%d", atoi(&i) );

Soo I would do it like this:

int inc;
char convert;
long int next_biggest = 0;
for (inc = 0; inc <= 986; inc++){
    int temp;
    convert = num[inc];
    long int total = atol(&convert);
    for (temp = 1; temp <= 13; temp++){
        convert = num[(inc + temp)];
        total *= atol(&convert);
    }
    if ((total > next_biggest)){
        next_biggest = total;
        printf("Next Biggest Number: %ld\n", total);
    }
}

So the basic idea is like.. I haven't tested but it should work like this. using ATOL for long. Note, you don't need a long with the single characters. Single characters are usually never over 255 unsigned and 128 signed.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM