Anzahl der Primfaktoren einer Zahl

Neue Frage »

Auf diesen Beitrag antworten »
Willinator 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;
}
 
Auf diesen Beitrag antworten »
eulerscheZahl 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;
}
Auf diesen Beitrag antworten »
Willinator 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!
Auf diesen Beitrag antworten »
eulerscheZahl

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;
}
 
Auf diesen Beitrag antworten »
Willinator

danke. jedoch darf ich laut meinem Prof nicht die #include <cstdlib> benutzen da wir die nicht hatten. ich darf nur die zwei anderen verwenden....
Auf diesen Beitrag antworten »
eulerscheZahl

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.
Auf diesen Beitrag antworten »
Willinator

habs noch mal in der codeansicht gemacht großes Grinsen
Auf diesen Beitrag antworten »
Willinator

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;
}
Auf diesen Beitrag antworten »
eulerscheZahl

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?
Auf diesen Beitrag antworten »
Willinator

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.
Auf diesen Beitrag antworten »
eulerscheZahl

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.
Auf diesen Beitrag antworten »
Willinator

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.
Auf diesen Beitrag antworten »
eulerscheZahl

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)
Auf diesen Beitrag antworten »
Willinator

Danke für deine Hilfe Daumen hoch

Habe mittlerweile meinen Fehler rausgefunden und weiß jetzt wie ich es wie und in welcher Art ich es am besten abgebe smile Deins hat mir dabei geholfen! Gott
 
Neue Frage »
Antworten »


Verwandte Themen

Die Beliebtesten »
Die Größten »
Die Neuesten »