DevC++ und 64-bit-Integer
-
Beim MSVC++ kann man hierfür __int64 aus windows.h verwenden. Wie macht man dies beim DevC++, oder muss man da eine externe Bibliothek einbinden?
-
DevC++ baut doch auf die GCC auf, dann geht das so wie in C, mit long long
-
Hatte mich irgendwie verfummelt. unsigned long long ist o.k.
Jetzt ist alles bestens:// Berechnung der "3n+1"-Folge "Collatz-Folge" #include <cstdio> #include <windows.h> main() { /**************************** Eingabebereich ****************************/ unsigned long long element_limit = static_cast<unsigned long long>( 1.0E6) ; // Maximum H(n) unsigned long long element_print_limit = static_cast<unsigned long long>( 1000) ; // Ausgabe nur, wenn H(n) > element_print_limit unsigned long long start = static_cast<unsigned long long>(1.0E18) ; // Beginn der Berechnung bei start unsigned long long end = static_cast<unsigned long long>(2.0E18) ; // Ende der Berechnung bei end /**************************** Eingabebereich ****************************/ unsigned long long zahl = 1 ; unsigned long long i = 1 ; for( unsigned long long j = start; j < end; j++ ) { zahl = j ; i = 1 ; while( ( zahl != 1 ) && ( i <= element_limit ) ) { if( zahl % 2 == 0 ) zahl = zahl / 2 ; else zahl = 3 * zahl + 1 ; i++ ; } if( zahl == 1 ) { if( i > element_print_limit ) { printf("Startzahl: %I64d", j) ; printf("\tAnzahl: %I64d\n", i) ; } } else { printf("Startzahl: %I64d", j) ; printf("kein Resultat (Anzahl-Limit erhoehen)") ; } if( i > element_limit ) MessageBox( NULL, "Anzahl zu hoch", "Info", MB_OK ) ; } return 0 ; }
Kann man das so lassen oder würdet ihr das anders machen?
-
erstmal was der g++ dazu sagt
> g++ -Wall -W -std=c++98 erhard_test.cc erhard_test.cc:5: warning: ISO C++ forbids declaration of `main' with no type erhard_test.cc: In function `int main()': erhard_test.cc:32: warning: int format, different type arg (arg 2) erhard_test.cc:33: warning: int format, different type arg (arg 2) erhard_test.cc:38: warning: int format, different type arg (arg 2)
main()
ist C (C < C99)! Kein C++!
unsigned long long element_print_limit = static_cast<unsigned long long>( 1000) ;
den Cast kannst du vermeiden
Dann solltest du kein C I/O benutzen, wenn du C++ unterrichtest!
Du solltest Deklarationen so lokal wie möglich machen (siehe zahl und i) und auch const nicht vergessen zu benutzen (start, end, element_limit etc.). Du solltest auch keine MessageBox benutzen um Fehler auszugeben! Das ist zu übertrieben, wenn dann benutz std::cerr bzw. schreib auf stderr
if( zahl % 2 == 0 ) zahl = zahl / 2 ;
hier würde ich ein newline einbauen. Macht das IMHO übersichtlicher, gerade beim Debuggen wird sofort deutlich wo das Ding hängt und du solltest /= gegenüber x = x / y bevorzugen!
und das return 0; am Ende ist überflüssig!
-
Außerdem plenkst Du!
-
Jo, thx, das printf(...) hatte ich ursprünglich wegen __int64 (MSVC++) eingebaut, weil cout dort seinen Dienst verweigerte. Also die nächste Version:
// Berechnung der "3n+1"-Folge (Collatz-Folge) #include <iostream> using namespace std; int main() { /*********************************************************** Eingabebereich ****************************/ const unsigned long long element_limit = 1000000 ; // Maximum H(n) const unsigned long long element_print_limit = 1000 ; // Ausgabe nur, wenn H(n) > element_print_limit const unsigned long long start = 1000000000000000000 ; // Beginn der Berechnung bei start const unsigned long long end = 2000000000000000000 ; // Ende der Berechnung bei end /*********************************************************** Eingabebereich ****************************/ for( unsigned long long j = start; j < end; j++ ) { unsigned long long zahl = j ; unsigned long long i = 1 ; while( ( zahl != 1 ) && ( i <= element_limit ) ) { if( zahl % 2 == 0 ) zahl /= 2 ; else zahl = 3 * zahl + 1 ; i++ ; } if( zahl == 1 ) { if( i > element_print_limit ) { cout << "Startzahl: " << j; cout << "\tAnzahl: " << i << endl; } } else { cout << "Startzahl: " << j; cout << "kein Resultat (Anzahl-Limit erhoehen)" << endl; } if( i > element_limit ) cerr << "Anzahl zu hoch" << endl; } }
Anmerkung: MSVC++ 6 akzeptiert standardmäßig kein "long long", dort __int64 mit printf(...)