PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : mein c++ programm funktioniert nicht so wie ich will



leifg
24-02-2002, 14:55
begeistert von c++ hab ich mich gestern hingeschrieben das alle primzahlen von 1 bis n bestimmen und anzeigen soll. aber es klappt nicht so wie ich es will. anstatt alle primzahlen auszugeben gibt es alle ungeraden zahlen aus (bei max=200 fehlt die 19 und bei max=150 bleibt es hängen).

noch kurz die erklärung wie es funktionieren soll: aufgebaut ist es auf dem sieb des eratosthenes. erst werden alle zahlen durch 2 geteilt. die zahlen die teilbar sind werden im array primzahlen mit 0 überschrieben. danach wird die nächstgrößere zahl im array primzahlen genommen und es werden alle zahlen im array durch diese geteilt und es geht wieder von vorne los. zum schluss müssten alle zahlen die nicht 0 sind primzahlen sein. hier der programmcode:

#ifdef HAVE_CONFIG_H
#include <config.h>
#endif

#include <iostream.h>
#include <stdlib.h>

int main()
{
int max;
cout << "Bitte angeben bis zu welcher Zahl Primzahlen errechnet werden sollen: ";
cin >> max;
cout << endl;
//max = 100;
int zahlen[max];
int primzahlen[max];
int j = 0;
int count;
//fills zahlen array with numbers from 1 to max
for (count = 0; count < max; count++)
{
if (max == 0)
{
break;
}
zahlen[count] = count + 1;
//cout << zahlen[i] <<endl;
}
j = 0;
int end = 2;
count = 0;
while (end <= max)
{

while (count <= max)
{
count++;
if (zahlen[count] % end == 0 && zahlen[count]!= end)
{
primzahlen[count] = 0;
}
//cout << primzahlen[count] <<endl;
}

for (count = 0; count <= max; count++)
{
if (primzahlen[count] > end)
{
end = primzahlen[count];
break;
}
}

}

count = 0;
int i = 1;
while (count <= max)
{
if (primzahlen[count] != 0)
{
primzahlen[count] = zahlen[count];
cout << i << ". " << primzahlen[count] <<endl;
i++;
}
count++;
}

return 0;
}

hoffentlich könnt ihr mir helfen

jgbauman
24-02-2002, 15:54
Dein Code hat etliche Probleme:

int max; max = ... ; int array[max]; // Das ist kein C++, das geht nur mit g++, Benutze mal die Flags "-ansi -pedantic -Wall" mit dem g++
if (max == 0){break;} // Diese Stelle wird nie erreicht, falls (max == 0)
Das Array primzahlen wird nie initizialisert.
Ein Array mit a[j] = j oder a[j] = j + 1 oder a[j] = j - 1 ist meist relativ sinnlos, da der Inhalt ja schon im Index codiert ist.
Es scheint Dir nicht ganz klar was wann in primzahlen und in zahlen steht:
[list=1]
zuerst initialisierts Du zahlen mit zahlen[j]= j + 1
primzahlen vergisst Du, da steht nur Müll drin, aber wahrscheinlich soll es genauso aussehen.
Dann überschreibst Du die Vielfachen der kleinsten Primzahl in primzahlen mit 0.
Nun suchst Du die naechst höhere Primzahl. Der Vergleich (primzahlen[count] > end) legt die Vermutung nahe, das Du primzahlen wie zahlen initialisieren wolltest.
Wieiter unten mach primzahlen[count] = zahlen[count]; keinen sinn, wenn primzahlen genauso initialisert sein soll wie zahlen
[/list=1]


Ich hab mich mal an einer einfacheren Version probiert:


#ifdef HAVE_CONFIG_H
#include <config.h>
#endif

#include <iostream>
#include <vector>

int main()
{
// Benutzereingabe
int max;

std::cout << "Bitte angeben bis zu welcher Zahl Primzahlen errechnet werden sollen: ";
std::cin >> max;
std::cout << std::endl;

// Die Initialisierung
std::vector<bool> istPrim(max + 1, true);
istPrim[0] = false;

// Das Sieben
for (unsigned int i = 2; i <= istPrim.size(); i++) {
if (!istPrim[i]) continue;
for (unsigned int j = 2 * i; j <= istPrim.size() ; j += i)
istPrim[j] = false;
}

// Die Ausgabe
for (unsigned int i = 0, j = 1; i <= istPrim.size(); i++)
if (istPrim[i])
std::cout << j++ << ". " << i << std::endl;

return 0;
}

leifg
24-02-2002, 22:48
int max; max = ... ; int array[max]; // Das ist kein C++, das geht nur mit g++, Benutze mal die Flags "-ansi -pedantic -Wall" mit dem g++

wie löst man das besser? ich hab vorher c geproggt.

was macht bei deinem programm std:: ??? und was steht in vector?

jgbauman
24-02-2002, 23:54
Hier mal zwei links:
http://www.voyager.prima.de/cpp/usingstd.html
http://www.msoe.edu/eecs/ce/courseinfo/stl/

... und noch ein Tip. Kauf/Leih Dir ein Buch zu ISO-C++. Das ist der gültige Standard für C++. Da es C++ schon etwas länger als den Standard gibt, ist aber leider viel Lehrmaterial etwas veraltet. Aber was aus den letzten drei Jahren stammt sollte eigentlich aktuell sein.

Und hier noch ein link (auch wenns erstmal zuviel sein wird):
http://www.cs.rpi.edu/~musser/ap/c++std/cd2/index.html

Leon1A
25-02-2002, 20:37
Hi,
Hier ist ein algo, der vielleicht etwas schneller ist:

#include <stdio.h>
#include <string.h>
#include <time.h>
#include <math.h>

void Primzahlen(unsigned int Max_za,int Prim_za[8000] )
{
int Primlaenge,primz;
unsigned int Halt,Test;
int Wurzel,j;

Primlaenge = 2;
Prim_za[0]= 2;
Prim_za[1]= 3;
Wurzel = sqrt(Max_za)+30000;
for (Test=5; Test <= Wurzel ; Test+=2)
{
Halt = 4;
primz = 0;
for (j=0; Prim_za[j]<=Halt; j++)
{
if ( (Test%Prim_za[j]) != 0) {
Halt = Test/Prim_za[j];
}
else {primz=1;break;}
} // ende 2. for
if ( primz==0) {
Prim_za[Primlaenge] = Test;
Primlaenge +=1;
}
} // ende 1. for
} // ende Primzahlen

/* bei Max_za = 65536 gibt es ca. 6500 Primzahlen. Erhöhe den Array, falls in einem größeren Bereich nach Primzahlen suchst.

Postet (alle) mal eine Bewertung, ob der Code gut ist (Schnell, Speichersparend, etc...)

Hat jemand Erfahrungen mit Thread Programmierung? Kann mir vorstellen, dass sich das hier auszahlt.

Léon