Dopo aver visto Project Euler - Triangular, pentagonal, and hexagonal (n.45) - codice C, vediamo un altro caso interessante: il problema numero 99 (link), con il titolo Largest exponential.
Non che sia eccessivamente difficile, ma è interessante ragionare bene su una cosa: la risoluzione semplice, tradizionale non sarebbe possibile e occorre applicare un po' di conoscenza matematica. Infatti, viene fornito in input un file chiamato base_exp.txt dove abbiamo 1000 righe, del tipo:
519432,525806
632382,518061
78864,613712
466580,530130
780495,510032
La richiesta è, analizzare questi numeri per ogni riga in questo modo: 519432525806, 632382518061, ecc e vedere infine quale di questi numeri risulta essere il più grande. Ebbene, la risoluzione tradizionale baseesponente NON sarebbe affatto possibile in quanto 519432525806 è dell'ordine di 103005259.28, numero talmente grande (avrebbe oltre tre milioni di cifre!) che non sarebbe possibile gestire dal calcolatore (il "double" arriva fino a 10308).
Quindi una soluzione è quella di ricorrere ai logaritmi: ad esempio 519432525806=10x, posso ricavare x=525806*log(519432)/log(10), dove log() può essere un logaritmo di base generica, in questo caso prendiamo 10.
Anche la funzione 10x è sempre crescente, quindi valori "x" più grandi indicano risultato complessivo più grande, quello che a noi interessa trovare.
Vediamo quindi il codice in C. Ovviamente scelto il linguaggio C sempre per questioni legate all'efficienza del codice.
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define N 1000
int main(){
FILE *f1=fopen("base_exp.txt","r");
int base[N];
int esponente[N];
register float max=0;
register int i,index;
for(i=0;i<N;i++){
fscanf(f1,"%d,%d",&base[i],&esponente[i]);
}
fclose(f1);
for(i=0;i<N;i++){
//printf("%d,%d\n",base[i],esponente[i]);
if(esponente[i]*log10(base[i])>max){max=esponente[i]*log10(base[i]);index=i;}
}
printf("stampa valore massimo:\ni=%d\nnumero=%d^%d\ncirca uguale a: 10^%.2f\n",index+1,base[index],esponente[index],max);
return 0;
}
I risultati sono:
- numero nella riga 709
- base = 895447
- esponente = 504922
- circa uguale a: 103005316
In ogni caso, questa è la mia domanda numero 200 🙂