Informatiker Board (http://www.informatikerboard.de/board/index.php)
- Themengebiete (http://www.informatikerboard.de/board/board.php?boardid=1)
-- Praktische Informatik (http://www.informatikerboard.de/board/board.php?boardid=6)
--- Anzahl der Primfaktoren einer Zahl (http://www.informatikerboard.de/board/thread.php?threadid=3302)
Geschrieben von Willinator am 16.11.2016 um 12:47:
Anzahl der Primfaktoren einer Zahl
Meine Frage:
Ich habe an der UNI eine Aufgabe bekommen wo ich nicht weiterkomme diesbezüglich:
"Schreiben sie ei Programm, dass für die Zahlen von 2 bis zu einer eingelesenen Zahl n die Zahl ihrer Primfaktoren ermittelt, z.B. hat 60 vier Faktoren. Geben sie das Ergebnis in Tabellenform aus und schreiben sie ein Gnuplot-Steuerprogramm um das Ergebnis graphisch dazustellen."
Ich programmiere in C++ und komme da nicht weiter da mein Programm nichts wirklich ausgibt und ich mir eig. sicher bin, dass das in der Art so stimmen sollte, ich aber bestimmt nur eine Zeile falsch habe oder irgendwie eine wichtige Sache vergessen habe. bei meiner Version gibt er mir "7=0" als Ergebnis an...
Würde mich über eine Hilfreiche Antwort freuen die mein Problem lösen könnte.
PS: Ich sollte möglichst nur Schleifen und Funktionen, hauptsächlich aber nur Schleifen verwenden und keine Strings da wir diese noch nicht an der Uni hatten.
Meine Ideen:
#include <iostream>
#include <cstdio>
int main () {
std::cout<<"Geben Sie eine Zahl n ein, die größer als 2 ist."<<::std::endl;
int z; // Zahlen bis n
int pf; // Primfaktoren
int a=0; //Anzahl der Primfaktoren bzw Schleifendurchlaeufe
int n; //Eingelesene Zahl
std::cout<<"Zahl n:";
std::cin>>n;
for (z=2; z<=n; z++) {
}
// i soll Hilfsvariable sein und z in Schleife ersetzen
for ( int i, pf=2; pf<=i; pf++) {
i = z;
while (i%pf == 0){ //Zahl durch Primfaktor restlos teilbar?
a++; //Anzahl Primfaktoren erhöhen
i/=pf;
}
}
printf("%d %d\n", z,a);
return 0;
}
Geschrieben von eulerscheZahl am 16.11.2016 um 16:44:
RE: Anzahl der Primfaktoren einer Zahl
| code: |
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
|
#include <iostream>
#include <cstdio>
int main () {
std::cout<<"Geben Sie eine Zahl n ein, die größer als 2 ist."<<::std::endl;
int n;
std::cout<<"Zahl n:";
std::cin>>n;
for (int z=2; z<=n; z++) { //die Schleife hat einen Inhalt, bei dir kam ein }
int i = z; //Initialisierung nicht in der inneren Schleife
int a = 0;
for (int pf=2; pf<=i; pf++) {
while (i%pf == 0) {
a++;
i/=pf;
}
}
printf("%d %d\n", z,a);
}
return 0;
} |
|
Geschrieben von Willinator am 16.11.2016 um 19:57:
Gnuplot
Danke für deine Antwort! Mit deiner Hilfe habe ich es jetzt gelöst und mit deiner Hilfe mein Programm geschrieben und jetzt funktioniert einwandfrei.
Mein jetziges Problem ist jetzt die ganze Sache grafisch in einem Gnuplot darzustellen. (habe mich auch im Internet schon informiert aber ich bekomm es nicht hin...)
Danke für weitere Hilfe schon mal im Vorraus!
Geschrieben von eulerscheZahl am 16.11.2016 um 20:14:
| code: |
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
|
#include <iostream>
#include <cstdio>
#include <cstdlib>
int main () {
FILE *stream = fopen("plot.txt", "w");;
std::cout<<"Geben Sie eine Zahl n ein, die größer als 2 ist."<<::std::endl;
int n;
std::cout<<"Zahl n:";
std::cin>>n;
for (int z=2; z<=n; z++) { //die Schleife hat einen Inhalt, bei dir kam ein }
int i = z; //Initialisierung nicht in der inneren Schleife
int a = 0;
for (int pf=2; pf<=i; pf++) {
while (i%pf == 0) {
a++;
i/=pf;
}
}
fprintf(stream, "%d %d\n", z, a);
}
fclose(stream);
system("gnuplot -p -e \"plot 'plot.txt'\"");
return 0;
} |
|
Geschrieben von Willinator am 16.11.2016 um 20:42:
danke. jedoch darf ich laut meinem Prof nicht die #include <cstdlib> benutzen da wir die nicht hatten. ich darf nur die zwei anderen verwenden....
Geschrieben von eulerscheZahl am 16.11.2016 um 20:49:
cstdlib ist nötig, um Systemfunktionen zu verwenden (Zeile 24). Ohne die Zeile würden wir nur eine Datei mit Koordinaten füllen und müssten gnuplot dann selbst noch von außerhalb des Programms aufrufen. Wäre das akzeptabel?
Habe noch
gnuplot iostream gefunden, aber wenn du cstdlib schon nicht verwenden darfst, scheidet das wohl auch aus.
Geschrieben von Willinator am 16.11.2016 um 21:01:
habs noch mal in der codeansicht gemacht
Geschrieben von Willinator am 16.11.2016 um 21:08:
Ich glaube es wäre akzeptabel bin mir aber durch die Aufgabenstellung nicht 100% sicher.
Zudem kommt noch hinzu, dass ich hier keine eingelesene Zahl verwende, da sonst der Gnuplot nicht funktioniert ("invalid x axis"). Dabei steht aber ja in der Aufgabenstellung, dass es aber bis zu einer eingelesenen Zahl die Anzahl der Primfaktoren ermitteln soll.
Gibt es hierzu vll eine Lösung?
Hier mein derzeitiges Programm dazu:
| code: |
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
|
//Test
#include <iostream>
#include <cstdio>
int main () {
int z=2; // Zahl von der ich die Primfaktoren will
int pf; // Primfaktoren
int a=0; //Anzahl der Primfaktoren bzw Schleifendurchläufe
int i; //Hilfvariable für z
const int MAX = 300;
for (z=2; z<=MAX; z++) {
i = z;
for (pf=2; pf<=i; pf++) {
while (i%pf == 0){ //Zahl durch Primfaktor restlos teilbar?
a++; //Anzahl Primfaktoren erhöhen
i/=pf;
}
}
std::cout<<z<<"\t"<<a<<std::endl;
a=0;
}
return 0;
}
|
|
Geschrieben von eulerscheZahl am 16.11.2016 um 21:09:
Code kriegst du mit [code]**hier Code einfügen**[/code].
In deinem Programm kommt gnuplot noch gar nicht zum Zug. Also wie kommst du zu "invalid x axis"?
Und wie hängt das mit dem Einlesen einer Zahl zusammen?
Geschrieben von Willinator am 16.11.2016 um 21:16:
Ich habe das .ccp Programm in eine .dat Datei umgewandelt und dann per Gnuplot "plotten" lassen.
Das mit der eingelesen Zahl verhält sich so, das ich eine Zahl als obergrenze festlegen soll bis wohin man alle Primfaktoren angezeigt bekommt und nicht wie es zur zeit ist im Programm an sich eine Obergrenze festgelegt ist.
Also man soll eine Zahl als Obergrenze je nach Lust und Laune angeben können ohne Quelltext des Programms zu verändern.
Also man öffnet das Programm, dann muss man eine Zahl als Obergrenze angeben (egal welche) und man bekommt alle Primfaktoren bis zu dieser Obergrenze angezeigt und zu dieser Ausgabe soll ein Gnuplot-Steuerprogramm geschrieben werden um es grafisch auszugeben.
Geschrieben von eulerscheZahl am 16.11.2016 um 21:24:
Also, ich fasse nochmal zusammen:
1. Du startest das cpp Programm
2. Du gibst eine Obergrenze ein
3. Das cpp Programm gibt dir eine Liste von Punkten (Anzahl der Primfaktoren), die du dann irgendwie (z.B. Pipe) in eine Datei schreibst
4. Du startest gnuplot und plottest diese Liste
richtig?
Wenn ja: genau das tut mein erstes Programm. Wenn du die Grenze von außerhalb des cpp Porgramms eingeben willst, kannst du einen Kommandozeilenparameter nehmen.
Geschrieben von Willinator am 16.11.2016 um 21:30:
1. bin im Terminal und nebenbei ist .cpp im Geany offen
2. ich schreibe ins Terminal: -/datei>datei.dat
3. dann gebe ich ins terminal "gnuplot" ein -> gnuplot geöffnet.
4. Dann schreibe ich in Gnuplot: plot "dateiname".dat und dann wird das ganze als Diagramm angezeigt -> funktioniert aber nicht in der Variante, das ich eine Zahl n einlese.
Geschrieben von eulerscheZahl am 16.11.2016 um 21:41:
| code: |
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
|
#include <iostream>
#include <cstdio>
using namespace std;
int main (int argc, char** argv) {
if (argc == 1) {
cout << "usage: " << argv[0] << " limit" << endl;
return 0;
}
int n = stoi(argv[1]);
for (int z=2; z<=n; z++) {
int i = z;
int a = 0;
for (int pf=2; pf<=i; pf++) {
while (i%pf == 0) {
a++;
i/=pf;
}
}
printf("%d %d\n", z,a);
}
return 0;
} |
|
Kompilieren: g++ --std=c++11 code.c
Aufruf: ./a.out 20 > plot.txt (a.out entsprechend durch deinen Programmnamen ersetzen)
Geschrieben von Willinator am 16.11.2016 um 21:53:
Danke für deine Hilfe
Habe mittlerweile meinen Fehler rausgefunden und weiß jetzt wie ich es wie und in welcher Art ich es am besten abgebe

Deins hat mir dabei geholfen!
Forensoftware: Burning Board, entwickelt von WoltLab GmbH