I need help solving this exercise (e.g.: 8 project Uler)!

Asked

Viewed 95 times

0

The question asks that in a number of 1000 digits we find the largest product of 30 adjacent numbers (question link), I know I can do this just by playing a 1000-digit string and checking if 1 to 5 is less than 2 to 6, and so on... but I am learning file manipulation and I would like to do the exercise using this method, so I arrived at this code unsuccessfully the result is incorrect:

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

#define len 4

int main( int argc, char** argv ) {
    char nums[len];
    int tot = 1, maior = 0,  cont, reset=1;

    FILE *numero; //cria um poiteiro numero do tipo arquivo
    if((numero = fopen("texto.txt", "r")) == NULL){ //caso ocorra algum erro na hora de abrir o arquivo informe erro e saia do programa
        printf("Error!\n");//mostra erro
        system("wait");//aguarda o usuario pressionar enter
        exit;//sair
    }

    for ( int i = 0; i < 1000; i++){//percorre cada caractere do numerozao
        if ( cont == len){
            cont = 0;
        }
        fscanf(numero, "%c", &nums[cont]);//coloca o valor do caractere em nums
        tot = 1;//reset o valor de tot
        for ( int a = 0; a < len; a++){
            tot *= (nums[a]-'0');//soma todos os valores de nums
        }
        if( tot > maior){
            maior = tot;//caso o valor novo seja maior que o valor antigo, atualize esse valor
        }
        if ( cont == -1*(1-len)){
            i = reset;//reseta o valor de i para que seja pego todos os valores
            reset++;
        }
        cont++;
    }
    printf("%d\n", maior);
    fclose(numero);
    return (EXIT_SUCCESS );
}

txt file: 7316717653133062491922511967442657474235534919493496983520312774506326239578318016984801869478851843858615607891129494954595017379583319528532088055111254069874715852386305071569329096329522744304355766896648950445244523161731856403098711121722383113622298934233803081353362766142828064444866452387493035890729629049156044077239071381051585930796086670172427121883998797908792274921901699720888093776657273330010533678812202354218097512545405947522435258490771167055601360483958644670632441572215539753697817977846174064955149290862569321978468622482839722413756570560574902614079729686524145351004748216637048440319989000889524345065854122758866688116427171479924442928230863465674813919123162824586178664583591245665294765456828489128831426076900422421902267105562632111110937054421750694165896040807198403850962455444362981230987879927244284909188845801561660979191338754992005240636899125607176060588611646710940507754100225698315520005593572972571636269561882670428252483600823257530420752963450

  • As you will always consider groups of 5 then read 5 digits, calculate the product, move the digits one position to the right and read another digit in the last position and redo the calculation.

1 answer

1


The program below finds the biggest product, but I believe the question calls for the thirtieth largest and not the greatest of all. For this I believe that the easiest way would be to store the 996 products in an array, order them and pick the thirtieth.

#include <stdio.h>    
int main() {
    char nums[5], aux[5];
    int cont=0, i, a, maior, prod;

    FILE *numero;
    numero = fopen("texto.txt", "r");

    for (i=0; i < 1000; i++) {
        fscanf(numero, "%c", &nums[cont]);
        if (cont < 4)
            cont++;
        else {
            prod = 1;
            for (a=0; a < 5; a++)
                prod *= (nums[a] - '0');
            if (i == 4)
                maior = prod;
            else {
                if (prod > maior)
                    maior = prod;
            }
            for (a=1; a<5; a++)
                nums[a-1] = nums[a];
        }
    }
    printf("Maior: %d\n", maior);
    fclose(numero);
    return 0;
}

For 30 consecutive digits:

#include <stdio.h>    
int main() {
    char nums[30];
    int cont=0, i, a, maior, prod;

    FILE *numero;
    numero = fopen("texto.txt", "r");

    for (i=0; i < 1000; i++) {
        fscanf(numero, "%c", &nums[cont]);
        if (cont < 30)
            cont++;
        else {
            prod = 1;
            for (a=0; a < 30; a++)
                prod *= (nums[a] - '0');
            if (i == 30)
                maior = prod;
            else {
                if (prod > maior)
                    maior = prod;
            }
            for (a=1; a<30; a++)
                nums[a-1] = nums[a];
        }
    }
    printf("Maior: %d\n", maior);
    fclose(numero);
    return 0;
}
  • Segmentation fault (core dumped).... Did not work!

  • Right after fopen test if the file opening has successfully occurred: if (number == NULL) { printf("Error opening file n"); Exit(1): }

  • This error has been solved, however the result is incorrect in the project

  • As I commented I did not understand this aspect of the thirtieth value. Is the thirtieth in ascending or descending order? Have you ever done the exercise without using a file? You know the answer?

  • The exercise asks us to find the 30 adjacent numbers (side by side) whose product is the largest... I haven’t done it yet, I’m running out of time... so I send you here to complement the answer

  • Well, that’s not what the question says on the link you posted: "The four Adjacent digits in the 1000-Digit number that have the Greatest product are 9 9 8 9 = 5832."

  • but this is the example they give us, the question even is below: "Find the Thirteen Adjacent digits in the 1000-Digit number that have the Greatest product. What is the value of this product?"

Show 2 more comments

Browser other questions tagged

You are not signed in. Login or sign up in order to post.