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" ) );
    }
    

Anmelden zum Antworten