Ho scritto questo programma in c per calcolare i primi numeri perfetti con la formula di Euclide, solo che dopo il 5° numero perfetto comincia a darmi dei risultati negativi, perche' evidentemente il long long int non contiene numeri cosi' grandi. Qualcuno sa come risolvere il problema? Riporto di seguito il sorgente:
#include <stdio.h>
#include <stdlib.h>
#define MAX_AR 1000
long long int pow(long long int n, int p);
long long int squareroot(long long int n);
int isprime(long long int o);
int main(){
int c=0, fine, array[MAX_AR];
register long long int o, n;
while(c<MAX_AR){
array[c]=0;
c++;
}
c=0;
printf("Inserire il numero: ");
scanf("%d", &fine);
for(n=1;n<=fine;n++){ //da n a fine
o=pow(2,n)-1;
if( isprime(o) ){array[c]=((o+1)/2)*o;c++;}
}
printf("Ricavato con la formula di Euclide sono: ", fine);
c=1;
while(array[c]){
printf("%d, ", array[c]);
c++;
}
printf("\b\b.\n");
system("PAUSE");
return 0;
}
long long int pow(long long int n, int p){
int i;
long long int tot;
tot=n*n;
for(i=0;i<p-2;i++)tot*=n;
return tot;
}
int isprime(long long int o){
long long int i;
if(o%2==0)return 0; //non e' primo
for(i=3;i<=squareroot(o);i+=2){
if(o%i==0) return 0; //non e' primo
}
return 1; //e' primo
}
long long int squareroot(long long int n){
long long int q=1;
while((q*q)<=n) q++;
return q;
}
-----------------------
Il bello di essere intelligente e' che puoi divertirti a fare l' imbecille, ma se sei un imbecille non puoi fare il contrario.
Woody Allen