Re: Und nun ein C++-Problem...
Verfasst: 27.01.2010 15:53
Ok, danke, funktioniert jetzt 
math.h und windows.h sind dort bei den includes, da ich diese für eine ergänzung, die später folgen wird, benötige
Edit:
Die mathematische Begründung für das mit der Wurzel ist übrigens bei diesem Beispiel zu erkennen:
loop = 25;
wurzel von loop = 5
loop / wurzel von loop + 1 = 0,...
wenn mal die wurzel von loop mit 1 addiert und loop durch das dann teilt, kommt immer eine zahl á la 0,... raus
Nohcmal Edit:
Die Datei wird aber leider nicht erstellt... o.O wo ist der fehler?
ich habe auch schon versucht, die datei so zu beschreiben:
Auch das geht nicht... 
Edit3: Übrigens: Wenn ich sage, dass i mit 3 initialisiert wird und dann jede immer i = i + 2 bei jedem durchgang der for-schleife gerechnet wird, kommt es dazu, dass es auch teilweise gerade zahlen als primzahlen gibt. deshalb muss ich bei 2 initalisieren und immer ++i rechnen...
Edit 4:
Die effizienteste Lösung wäre vermutlich sowieso, wenn man alle bereits rausgefundenen primzahlen in ein array schreibt und einfach bei einer neuen zahl prüft, ob diese zahl ein vielfaches einer primzahl ist. wenn nicht, ist die zahl ebenfalls eine primzahl.
Das kombiniert mit der wurzel-geschichte und man hat ein extrem effektives programm, dass auf mehreren kernen sicherlich in 1-2 minuten über 150.000 primzahlen berechnen könnte (momentan ca. 80.000 zahlen in 5 minuten auf einem kern...)

math.h und windows.h sind dort bei den includes, da ich diese für eine ergänzung, die später folgen wird, benötige

Edit:
Die mathematische Begründung für das mit der Wurzel ist übrigens bei diesem Beispiel zu erkennen:
loop = 25;
wurzel von loop = 5
loop / wurzel von loop + 1 = 0,...
wenn mal die wurzel von loop mit 1 addiert und loop durch das dann teilt, kommt immer eine zahl á la 0,... raus

Nohcmal Edit:
Code: Alles auswählen
// Test.cpp
#include <iostream>
#include <windows.h>
#include <time.h>
#include <math.h>
#include <fstream>
using namespace std;
int main() {
double loop;
double i;
double max;
boolean prim;
ofstream f("C:\\prim.txt", ios::app);
cout << "Geben Sie die Zahl ein, bis zu der gezaehlt werden soll:" << endl;
cin >> max;
cout << "==================================================" << endl;
f << "Primzahlen" << endl;
for(loop = 1;loop <= max;++loop) {
prim = true;
for(i = 2;i < sqrt(loop);++i) {
if(loop / i == ceil(loop / i)) {
prim = false;
}
}
if(prim == true) {
cout << loop << endl;
f << loop << endl;
}
}
}
ich habe auch schon versucht, die datei so zu beschreiben:
Code: Alles auswählen
fstream f;
...
f.open("C:\\prim.txt",ios::app));
f << loop << endl;
f.close();

Edit3: Übrigens: Wenn ich sage, dass i mit 3 initialisiert wird und dann jede immer i = i + 2 bei jedem durchgang der for-schleife gerechnet wird, kommt es dazu, dass es auch teilweise gerade zahlen als primzahlen gibt. deshalb muss ich bei 2 initalisieren und immer ++i rechnen...
Edit 4:
Die effizienteste Lösung wäre vermutlich sowieso, wenn man alle bereits rausgefundenen primzahlen in ein array schreibt und einfach bei einer neuen zahl prüft, ob diese zahl ein vielfaches einer primzahl ist. wenn nicht, ist die zahl ebenfalls eine primzahl.
