Primzahlen Ausgeben

DarKo87

Mitglied
Hallo,

Ich bin gerade dabei auf projecteuler ein paar Aufgaben zu lösen.
Irgendwie klemm ich schon den halben Tag an der mir simplen Aufgabe Primzahlen auszugeben.

Code:
#include <stdio.h>

int main(void){

	int i=0, zahl=0, prim_z=2;
	printf("1 >> 2\n");
	for(i=2;prim_z<=10;i++){
		for(zahl=i-1;i>2;zahl--){
			if(((i/zahl)%2)==0){
				prim_z=0;
				break;
			}
		}
		if(prim_z==1){
			printf("%d >> %d\n", prim_z, i);
			prim_z++;
		}
	}

	return 0;

}

Er schmeißt mich jedesmal an diesem Code raus

Code:
if(((i/zahl)%2)==0){
prim_z=0;
break;

Seh aber einfach nicht, woran es happert :-/

Gruß DarKo
 
Hi,

debugge mal den Verlauf des Programms durch, dann siehst du warum er dir hier die Schleife abbricht:

C:
// i=0, zahl = 0, prim_z = 2
   for(i = 2; prim_z <= 10; i++) {

// i=2, zahl = 0, prim_z = 2
        for(zahl = i-1; i > 2; zahl--) {

// i=2, zahl = 1, prim_z = 2
            if(((i / zahl) % 2) == 0) {

// 2 / 1 = 2; 2 % 2 = 0; von daher springt er in diese if-Anweisung rein

Gruß,
BK
 
Hi

steht keine Fehlermeldung dabei?
Vllt. Division durch 0?

Dieses Codestück
C++:
for(zahl=i-1;i>2;zahl--){
    if(((i/zahl)%2)==0){
        prim_z=0;
        break;
    }
}
Zahl zählt von i weg runter, runter, runter...wenn es an 0 ankommt krachts bei der Division.
In der Schleife prüfst du, ob i noch groß genug ist (i ändert sich hier nie),
dabei soll wahrscheinlich zahl geprüft werden.
 
Hi.

Es hapert so'n bißchen an allen Ecken und Enden.

Du verwendest z.b. prim_z in seltsamer Weise. Es gibt nur 2 Stellen wo du prim_z änderst. Das ist entweder Zeile 10 oder Zeile 16.

Zeile 16 kann aber nie erreicht werden, denn du initialisierst prim_z mit 2 und änderst es höchstens noch auf 0.

Darum wird auch die äußere Schleife nicht abgebrochen, da prim_z immer kleiner 10 ist.

Überlege dir erstmal wie du für ein einzelne Zahl feststellen kannst, ob diese eine Primzahl ist und implementiere eine Lösung dafür und teste diese ausgiebig.

Erst dann solltest du versuchen das größere Problem zu lösen.

Am besten schreibst du dir eine Funktion dafür. Ungefähr so:
C:
/**
 * Predicate to check whether a number is prime.
 *
 * @return 1 if number is prime, 0 otherwise
 */
int isPrime(int number) {
  ....
}

int main() {
  int num = ...;

  if (isPrime(num)) {
    puts("yes");
  } else {
    puts("no");
  }
}
Gruß
 
Danke für die Schnellen Antworten.

Es happert tatsächlich an mehreren Ecken xP
Ich sollte vielleicht einfach nochmal von vorne beginnen und mein Konzept etwas überdenken.
 
Okay, hab das ganze nun etwas angepasst.

Nun rechnet er falsch.

Code:
if(((i/zahl)%2)==0)

(5/2)%2 ist doch !=0 ... aber trotz allem wird bei der Rechnung die Anweisung erfüllt ...
Weshalb?
 
Hi,

als Integer betrachtet ergibt 5 / 2 genau 2. Somit stimmt die Aussage, dass (5 / 2) % 2 == 0.

Grüße,
BK
 
Hallo. Ich bin jetzt mal ganz frisch angemeldet^^
Ich will die Gelegenheit nutzen und dir meinen Code auf´s Auge drücken, den ich zu Anfang meiner C++ Zeiten (vor etwa 2 Wochen) geschrieben habe, um mich an den Variablen zu probieren. Meine Variablennamen sind nicht die besten.

Code:
#include <iostream>
using namespace std;



int main (void)
{
    int momzahl = 1;
    int endzahl = 0;
    int speicher = 1;
    int prim = 0;
    int ende = 0;

    while ((ende - endzahl) > 1500 || (ende - endzahl) <= 0 || ende <= 0 || endzahl <= 0)
    {
        cout << "Bitte Zahlenspektrum der kleiner als 1500 Werte beträgt angeben." << endl << "von: ";
        cin >> endzahl;
        cout << "Bis: ";
        cin >> ende;
        if ((ende - endzahl) > 1500 || (ende - endzahl) <= 0 || ende <= 0 || endzahl <= 0)
            cout << endl << "ungültiger Wertebereich" << endl << endl;

    }


    while (endzahl < ende)
    {
        speicher = endzahl % momzahl;
        //cout << " " << " E:" << endzahl << " M:" << momzahl << " S:" << speicher << endl;
        if (speicher == 0)
        {
            if (momzahl == endzahl)
            {
                prim = endzahl;
                cout << prim << " ist eine Primzahl" << endl;
                momzahl = 2;
                endzahl++;
            }
            else
            {
                endzahl++;
                momzahl = 2;
            }
        }
        else
        {
            if (momzahl == endzahl)
            {
                endzahl++;
                momzahl = 2;
            }
            momzahl++;
        }

    }
    return 0;
}


Die obere While Schleife kannst du übersehen, das hab ich nur gemacht, um sicher zu stellen, das man auch alle Ergebnisse sehen kann. Man kann das ganze unendlich fortsetzen und größer machen.

Zur Vorgehensweise. Primzahlen sind Zahlen die nur durch sich und durch 1 Teilbar sind, das heißt, dass KEINE Zahl VON 2 BIS getestete Zahl einen Rest von Null hat. Also nehmen wir 666. 666 % 2 == 0, fällt weg.

Nun hab ich eine große Schleife erstellt. Mein Vorgehen war, alle Zahlen von 2 bis gesuchte Zahl mit der Rechnung gesuchte Zahl % momentane Zahl zu durchlaufen und das Ergebnis auf 0 zu prüfen. Wenn dieser irgendwann 0 erreicht, dann wird die Momentane Zahl wieder auf 2 gesetzt (2, weil X % 1 ja immer 0 ergäbe) und die Endzahl um eins erweitert. Das Spiel wird solange fortgesetzt bis der Zähler der Momentane Zahl == der Zähler der gesuchten Zahl ist. Programmintern sieht es etwa so aus

5 % 2 != 0
5 % 3 != 0
5 % 4 != 0
5 == 5 -> Ausgabe Primzahl 5
6%2 == 0 -> weiter
7%2 != 0

Ich hoffe das ganze ist nicht zu verwirrend^^ Ich fand deinen Code etwas verwirrend OO nicht zuletzt weil meine persönliche Vorlieben bei Leerzeilen wo es geht und jeder Befehl eine eigene Zeile liegen^^

Hoffe ich konnte helfen
 
Hey aaron,

Vielen Dank für deinen Code ;-)

Geholfen hat mir diese Zeile
Code:
 speicher = endzahl % momzahl;
Dadurch war mir klar, warum meine berechnungen ständig falsch waren.

Nun klappt es wie es soll und ist beliebig erweiterbar.
Code:
#include <stdio.h>

int main(void){

	int i=0, zahl=0, prim_z=1, prim=1;
	double erg=0;
	for(i=2;prim<=10;i++){
		for(zahl=i-1;zahl>=2;zahl--){
			erg=i%zahl;
		if(erg==0){
				prim_z=0;
				break;
			} else {
				prim_z=1;
			}
		}
		if(prim_z==1){
			printf("%d >> %d\n", prim, i);
			fflush(stdout);
			prim++;
			}
		}

		return 0;
	}

Vielen Dank für die Zahlreichen Hilfestellungen :)

Gruß DarKo
 

Neue Beiträge

Zurück