Rechenzeit verkürzen
-
Hallo, das Programm läuft richtig, außer das es manchmal nicht, wie vorgesehen, endet. Es berechnet die Trigonalzahlen, und kuckt mit der For-Schleife bei jeder nach, ob sie auch Quadratzahl ist.
Ich möchte nun die Rechenzeit verkürzen, weil in der For-Schleife ja eigentlich nicht jedesmal bei 1 von neuem angefangen werden muss. Es würde reichen bei "zähler/2" aber da bekommt man krumme Werte. Wie kann ich machen, daß von dem Krummen Wert nur der Vorkommateil in der Variablen steht?
#include <iostream> using namespace std; int main (int argc, char * const argv[]) { long long zaehler = 0; long long trigonal = 0; printf("Das Pr. sucht die Zahlen heraus, welche zugleich Quadratzahlen und Trigonalzahlen sind. \n"); while (zaehler < 1000000) { trigonal = trigonal+zaehler; for (long long i=1, x = 1; x*x <= trigonal; i += ++x) // Der Erhöher muss dynamisch werden if (trigonal== x*x) cout << "Zaehler=\t " << zaehler <<"\t" <<" Sum= \t " << trigonal << "\tt" << " xq = \t " << x*x << "\t" << "Sqrt = \t " << x << endl; zaehler++; } printf("Das programm endet mit Zähler %d\n", zaehler); return 0; }
-
"Krumme Werte" bekommst du in einen long long sowieso nicht rein.
-
Hallo,
benutze eine der Fkt. aus math.h:
floor, ceil, oder modf
Gruß,
Andreas
-
Hallo,
benutze eine der Fkt. aus math.h:
floor, ceil, oder modf
Gruß,
Andreas
-
AndreasBoch schrieb:
Hallo,
benutze eine der Fkt. aus math.h:
floor, ceil, oder modf
Gruß,
Andreas
Braucht er doch gar nicht. zähler ist ein long long und zähler/2 ergibt sowieso eine Ganzzahl.
-
@TE
Benutz doch einmal cpp-Tags.
-
Fellhuhn schrieb:
@TE
Benutz doch einmal cpp-Tags.
Hat er doch, oder?
-
Also mit zaehler/2 geht es wirklich schneller und auch korrekt, was ich nicht dachte. Kann man noch beschleunigen? Es läuft ungefähr 10 Minuten.
Unterschied: Er schreib zum Anfang eine Null-Zeile:
Das Pr. sucht die Zahlen heraus, welche zugleich Quadratzahlen und Trigonalzahlen sind.
Zaehler= 0 Sum= 0 t xq = 0 Sqrt = 0
Zaehler= 1 Sum= 1 t xq = 1 Sqrt = 1
Zaehler= 8 Sum= 36 t xq = 36 Sqrt = 6
Zaehler= 49 Sum= 1225 t xq = 1225 Sqrt = 35
Zaehler= 288 Sum= 41616 t xq = 41616 Sqrt = 204
Zaehler= 1681 Sum= 1413721 t xq = 1413721 Sqrt = 1189
Zaehler= 9800 Sum= 48024900 t xq = 48024900 Sqrt = 6930
Zaehler= 57121 Sum= 1631432881 t xq = 1631432881 Sqrt = 40391
Zaehler= 332928 Sum= 55420693056 t xq = 55420693056 Sqrt = 235416
Das programm endet mit Zähler 1000000
-
-
#include <vector> #include <algorithm> #include <iostream> using namespace std; int main() { const int max = 1000000; vector<long long> q( max ), d( max ); q[0] = d[0] = 1; for( long long i = 1; i < max; ++i ) { q[i] = q[i-1] + 2 * i + 1; d[i] = d[i-1] + i + 1; } set_intersection( q.begin(), q.end(), d.begin(), d.end(), ostream_iterator<long long>( cout, "\n" ) ); }