003
18.01.2003, 12:19 Uhr
NemoEimi
|
Zitat: |
Bruder Leif postete Moin!
Hier das ganze in C. Hat noch ordentlich Potential für Optimierungen ;-)
|
Das kann man wohl sagen . Ich habe mal mein Java-Programm so abgeändert, daß es ebenfalls alle c ausfiltert, die Vielfache von anderen sind:
C++: |
public class triplets { public static boolean[] hash; public static void eliminateMultiples(int n) { for (int i = 2*n; i < hash.length; i = i + n) hash[ i ] = false; } public static void findTriplets(int n) { for (int i = 1, isquared = i * i; isquared < n; i++, isquared = i*i) { for (int j = 1, jsquared = j * j; j < i && isquared + jsquared < n; j++, jsquared = j*j) { int c = isquared + jsquared; hash[c] = true; } } } public static void main(String[] argv) { int n = Integer.parseInt(argv[0]); int zaehler = 0; hash = new boolean[n]; findTriplets(n); for (int i = 1; i < n; i++) if (hash[ i ]) {zaehler++; eliminateMultiples(i);}; System.out.println(zaehler + " Werte für c gefunden."); } }
|
und Deines so, daß es die gefundenen c-Werte nur noch zählt. Mein Programm terminiert dann (statisch compiliert mit gcj -O3 -fomit-frame-pointer) nach 0.22 Sekunden User-time, Deines war nach einer Stunde noch nicht zurückgekommen und länger habe ich nicht gewartet . Aber abgesehen mal davon, bist Du sicher, daß Dein Programm korrekt ist? Ich würde vermuten, daß aQuadrat und cQuadrat überlaufen ab einem gewissen Punkt.
Grüße, NemoEimi Dieser Post wurde am 18.01.2003 um 12:56 Uhr von NemoEimi editiert. |