Project Euler, Problem #10 έγραψε:
The sum of the primes below 10 is 2 + 3 + 5 + 7 = 17.
Find the sum of all the primes below two million.
Αυτή με ταλαιπώρησε μέχρι να καταλάβω πως γινόταν υπερχείλιση (overflow) στη μεταβλητή που υπολογίζει το άθροισμα. Τελικά χρησιμοποίησα τύπο: unsigned long long και "%llu" στο printf. Επειδή το long δεν είναι ίδιο σε όλες τις πλατφόρμες, μπορείτε να κάνετε: #include <stdint.h> και να χρησιμοποιήσετε τον τύπο: int64_t με "%lld" στο printf (αν δεν σας δουλεύει δηλαδή καλά με long long).
Επίσης, ο αλγόριθμος που χρησιμοποίησα είναι αυτός του προβλήματος #7 ο οποίος είναι πολύ αργός, ειδικά σε αργά μηχανήματα. Υπάρχουν ειδικοί αλγόριθμοι για το άθροισμα πολλών πρώτων αριθμών, με πιο γνωστό το "κόσκινο του Ερατοσθένη" και της μετέπειτα βελτιώσεις του, η τον αλγόριθμο του ίδιου του Euler (θα τα βρείτε αν γκουγκλάρετε) καθώς και μερικοί ακόμα.
Εγώ βαρέθηκα να ασχοληθώ σε τόσο βάθος, οπότε σας παρουσιάζω την απλή λύση (με χρήση συνάρτησης). Σε I3 με Windows7 64bit Home και compiled με Pelles-C που παράγει 64-μπιτο εκτελέσιμο, κάνει γύρω στα 5 δευτερόλεπτα. Με mingw32 (minimal gcc port για Windows) που βγάζει 32-μπιτο εκτελέσιμο κάνει γύρω στα 20 δευτερόλεπτα.
Λύση 1, σε C (με χρήση συνάρτησης)- Κώδικας: Επιλογή όλων
#include <stdio.h>
#include <math.h>
// --------------------------------------------------------------
int isprime( unsigned long long int num )
{
unsigned long long int i;
for (i=2; i <= sqrt(num); i++)
if ( num % i == 0 )
return 0; // FALSE
return num < 2 ? 0 : 1;
}
// --------------------------------------------------------------
int main ( void )
{
unsigned long long int n, primesum = 0;
for (n=2; n < 2000000; n++)
if ( isprime(n) )
primesum += n;
printf("%llu\n", primesum);
return 0;
}
Τελευταία επεξεργασία από
migf1 και 23 Ιούλ 2011, 14:36, έχει επεξεργασθεί 2 φορά/ες συνολικά