Primzahlen (Summe)
-
Man schreibe ein C++-Programm, das nach Eingabe einer Zahl n für alle geraden Zahlen zwischen 4 und n alle Darstellungen als Summe zweier Primzahlen findet und ausgibt.
Eine mögliche Zeile der Ausgabe könnte z.B. sein:
44=3+41=7+37=13+31----
Ich habe da schon was gemacht, aber ich weiß nicht, wieso es nicht klappt, sieht jemand den Fehler/ die Fehler?
#include <iostream> using namespace std; bool isprim(int a); void sumprim(int n); int main() { int p; cout << "Geben Sie eine ganze Zahl größer 6 ein." << endl; cin >> p; sumprim(p); } bool isprim(int a){ bool isprimnum = true; int div; for(div=2; div<a; div++){ if( a % div == 0) { isprimnum = false; break; } } return isprimnum; } void sumprim(int n){ int m, i, j, k; for(i=3; 2*i<n; i++){ m=2*i; for(j=2; j<m; j++){ if(isprim(j)){ for(k=j+1; k<m; k++){ if(isprim(k) && j+k==m){ cout << m << "=" << j << "+" << k << endl; } } } } } }Viele Grüße
-
#include <iostream> using namespace std; bool isprim(int a); void sumprim(int n); int main() { int p; cout << "Geben Sie eine ganze Zahl größer 4 ein." << endl; cin >> p; sumprim(p); } bool isprim(int a) { bool isprimnum = true; int div; for(div=2; div<a; div++) { if( a % div == 0) { isprimnum = false; break; } } return isprimnum; } void sumprim(int n) { int i, j; for(i=3; 2*i<n; i++) { if(isprim(i)) { j=n-i; if(isprim(j)) { cout << n << "=" << i << "+" << j << endl; } } } }
-
Hallo, könntest Du vielleicht kurz sagen, was du verändert hast?
-
LinuxC_newbie schrieb:
Hallo, könntest Du vielleicht kurz sagen, was du verändert hast?
Vergleich mal dein sumprim mit volkards. Sind doch nur 15 Zeilen.
-
LinuxC_newbie schrieb:
Hallo, könntest Du vielleicht kurz sagen, was du verändert hast?
Habe nur die sumprim angefasst, aber die komplett verändert. dein vorgehen fand ich zu umständlich. als mensch würde ich ja auch nur bei n=44 das i von 2(uups, nicht 3!) bis 22 laufen lassen und j ist dann immer 44-i. und wenn i und j prim sind, habe ich einen treffer.
edit: uups2, und <= statt <.
-
Aber ich soll doch für jede gerade Zahl zwischen 4 und 44 die möglichen Summen aus zwei Primzahlen ausgeben lassen und nicht für n=44.
Edit
Dann wohl in der main-function:
int main() { int p; cin >> p; for(int s=3; 2*s<p; s++) { sumprim(2*s); } }
-
Irgendwie geht es nicht...

#include <iostream> using namespace std; bool isprim(int a); void sumprin(int n); int main(){ int p, q; cout << "Ganze Zahl größer 6 eingeben." << endl; cin >> p; for(q=3; 2*q<p; q++){ sumprim(2*q); } } bool isprim(int a){ bool isprimnum=true; int div; for(div=2; div<a;div++){ if(a % div ==0){ isprimnum=false; break; } } return isprimnum; } void sumprim(int n){ int i, j; for(i=2; i<n; i++){ if(isprim(i)){ j=n-i; if(isprim(j)){ cout << n << "=" << i << "+" << j << endl; } } } }Aber da kommt beim Kompilieren die Fehlermeldung:
error in function sumprim(int): statement cannot reslve adress of overloaded function
Was stimmt nicht?
-
#include <iostream> using namespace std; bool isprim(int a); void sumprim(int n); int main() { int p; cin >> p; for(int s=2; 2*s<=p; s++) { sumprim(2*s); } } bool isprim(int a) { bool isprimnum = true; int div; for(div=2; div<a; div++) { if( a % div == 0) { isprimnum = false; break; } } return isprimnum; } void sumprim(int n) { int i, j; cout << n ; for(i=2; 2*i<=n; i++) { if(isprim(i)) { j=n-i; if(isprim(j)) { cout << "=" << i << "+" << j; } } } cout << '\n'; }
-
Tut mir leid, aber wenn ich das kompiliere, was ohne Fehler passiert und dann ausführe, passiert gar nichts.
-
LinuxC_newbie schrieb:
Tut mir leid, aber wenn ich das kompiliere, was ohne Fehler passiert und dann ausführe, passiert gar nichts.
Klar. Er wartet auf die Eingabe von p, der Obergrenze.
-
Doch, sorry, ich habe nur den EIngabebefehl vergessen. Entschuldigung.
Was mich noch irritiert ist, wieso das i in sumprim solange erhöht wird, bis i<2*n.
Wieso diese Grenze 2*n?
-
LinuxC_newbie schrieb:
Doch, sorry, ich habe nur den EIngabebefehl vergessen. Entschuldigung.
Was mich noch irritiert ist, wieso das i in sumprim solange erhöht wird, bis i<2*n.
Wieso diese Grenze 2*n?
solange wie 2*i<=n, also solange wie i<=n/2
Ich verlange, daß i<=j, damit er nicht ausgibt
44=3+41=7+37=13+31=31+13=37+7=41+3gewöhn Dir "solange bis" besser ab, In C++ sind es immer Laufbedingungen und keine Abbruchbedingungen.
-
Dankeschön! Jetzt hab' ich es verstanden.

-
LinuxC_newbie schrieb:
bool isprim(int a) { bool isprimnum = true; int div; for(div=2; div<a; div++) { if( a % div == 0) { isprimnum = false; break; } } return isprimnum; }Das hatten wir schonmal schöner (und schneller: Teiler nur bis zur Wurzel, Zweierschritte usw.) http://www.c-plusplus.net/forum/277751-20:
// >Test ob Primzahl bool primtest (int p) { int zaehler; if (p == 2) return true; if (p %2 == 0) return false; for (zaehler = 3; zaehler * zaehler <= p; zaehler = zaehler+2) { if (p % zaehler == 0) return false; } return true; }