07/03/15 13:35
Buongiorno
Stamattina ho deciso di provare a risolvere il problema n°8 di ProjectEuler ( projecteuler.net/… ). Ho dunque scritto l'algoritmo e l'ho tradotto in linguaggio C, ottenendo questo codice:
L'idea di base dell'algoritmo è quella di trascrivere le cifre assegnate in un file, e da lì leggerle a gruppi di 13 per poterci poi lavorare.
Quando vado ad eseguire il codice, però, esso non funziona, e ottengo il risultato che potete vedere nell'immagine allegata.
Secondo voi, dove ho sbagliato?
Stamattina ho deciso di provare a risolvere il problema n°8 di ProjectEuler ( projecteuler.net/… ). Ho dunque scritto l'algoritmo e l'ho tradotto in linguaggio C, ottenendo questo codice:
#include <stdio.h> #include <stdlib.h> #include <stdbool.h> /*dichiarazione variabili globali contenenti il massimo prodotto, i 13 numeri da moltiplicare, un interruttore per sapere se il processo è avvenuto correttamente e tutte le cifre su cui lavorare*/ long int max_prod = 0; int val[13]; bool completo = true; char string[] = "7316717653133062491922511967442657474235534919493496983520312774506326239578318016984801869 47885184385861560789112949495459501737958331952853208805511125406987471585238630507156932909 63295227443043557668966489504452445231617318564030987111217223831136222989342338030813533627 66142828064444866452387493035890729629049156044077239071381051585930796086670172427121883998 79790879227492190169972088809377665727333001053367881220235421809751254540594752243525849077 11670556013604839586446706324415722155397536978179778461740649551492908625693219784686224828 39722413756570560574902614079729686524145351004748216637048440319989000889524345065854122758 86668811642717147992444292823086346567481391912316282458617866458359124566529476545682848912 88314260769004224219022671055626321111109370544217506941658960408071984038509624554443629812 30987879927244284909188845801561660979191338754992005240636899125607176060588611646710940507 754100225698315520005593572972571636269561882670428252483600823257530420752963450"; /*dichiarazione delle funzioni necessarie*/ long int lettura(char[], long int); long int moltiplica(int[]); long int confronta(long int, long int); int main() { /*definizione dell'indice dei valori letti dal file, e scrittura del file*/ long int indice = 0; FILE* numeri = fopen("file.dat", "w"); fprintf(numeri, "%s", string); fclose(numeri); /*Inizio della computazione: introduzione dell'utente nel programma e inizio lettura del file*/ printf("Inizio del calcolo: apertura del file... \n"); long int prodotto = lettura("file.dat", indice); /*confronto del prodotto appena ottenuto con il massimo prodotto ottenuto fin'ora*/ if (prodotto != 0) { max_prod = confronta(prodotto, max_prod); prodotto = lettura("file.dat", indice); } /*se tutti i prodotti sono già stati calcolati e confrontati, il massimo di loro viene stampato*/ else if (prodotto == 0) { printf("Fine del file. \n Il massimo prodotto possibile è %u", max_prod); printf("\n Premere un qualsiasi tasto per uscire."); getchar(); return 0; } } long int lettura(char nome[],long int indice) { /*il file viene aperto*/ FILE* numeri = fopen(nome, "r"); /*i numeri vengono letti*/ for (int i = 0; i <= 12; i++) { /*si imposta la posizione da cui cominciare la lettura*/ fseek(numeri, indice, SEEK_SET); /*se il file è già stato letto tutto, il ciclo si può interrompere*/ if (ftell(numeri) == EOF) { completo = false; break; } /*se viene letto uno zero, il prodotto sarà nullo, quindi è inutile proseguire: meglio andare oltre lo zero*/ else if (fscanf(numeri, "%d", &val[i]) == 0) { i = 0; indice = ftell(numeri) + 1; } /*se il valore letto non è uno zero, esso può essere memorizzato nell'array*/ else { fscanf(numeri, "%d", &val[i]); printf("Numero letto: %d \n", val[i]); i++; indice++; } } /*se la lettura è completa, i numeri rilevati devono essere moltiplicati tra loro*/ if (completo == true) { int prodotto = moltiplica(val); fclose(numeri); return prodotto; } /*se il file è finito, la lettura non deve più continuare*/ else if (completo == false) { fclose(numeri); return 0; } } long int moltiplica(int val[]) { /*si inizializa il prodotto assegnandogli il primo valore letto dal file*/ int prodotto = val[0]; /*si effettua la moltiplicazione e si stampa il risultato*/ for (int i = 1; i <= 12; i++) prodotto *= val[i]; printf("Prodotto ottenuto: %s", prodotto); /*il valore finale viene inviato*/ return prodotto; } long int confronta(long int prod1, long int prod2) { /*se il prodotto appena ottenuto è minore del massimo ottenuto fin'ora, il valore massimo rimane uguale*/ if (prod1 <= prod2) return prod2; /*altrimenti, un nuovo massimo è stato trovato, ed occorre memorizzarlo*/ else if (prod1 > prod2) return prod1; }
L'idea di base dell'algoritmo è quella di trascrivere le cifre assegnate in un file, e da lì leggerle a gruppi di 13 per poterci poi lavorare.
Quando vado ad eseguire il codice, però, esso non funziona, e ottengo il risultato che potete vedere nell'immagine allegata.
Secondo voi, dove ho sbagliato?
Ultima modifica effettuata da 07/03/15 14:56