Registrierung Kalender Mitgliederliste Teammitglieder Suche Häufig gestellte Fragen Zur Startseite

Informatiker Board » Themengebiete » Praktische Informatik » Anzahl der Primfaktoren einer Zahl » Hallo Gast [Anmelden|Registrieren]
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | An Freund senden | Thema zu Favoriten hinzufügen
Neues Thema erstellen Antwort erstellen
Zum Ende der Seite springen Anzahl der Primfaktoren einer Zahl
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
Willinator
Grünschnabel


Dabei seit: 16.11.2016
Beiträge: 8

Anzahl der Primfaktoren einer Zahl Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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;
}
16.11.2016 12:47 Willinator ist offline Beiträge von Willinator suchen Nehmen Sie Willinator in Ihre Freundesliste auf
eulerscheZahl eulerscheZahl ist männlich
Foren Gott


Dabei seit: 04.01.2013
Beiträge: 2.859

RE: Anzahl der Primfaktoren einer Zahl Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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;
}


__________________
Syntax Highlighting fürs Board (Link)
16.11.2016 16:44 eulerscheZahl ist offline Beiträge von eulerscheZahl suchen Nehmen Sie eulerscheZahl in Ihre Freundesliste auf
Willinator
Grünschnabel


Dabei seit: 16.11.2016
Beiträge: 8

Gnuplot Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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!
16.11.2016 19:57 Willinator ist offline Beiträge von Willinator suchen Nehmen Sie Willinator in Ihre Freundesliste auf
eulerscheZahl eulerscheZahl ist männlich
Foren Gott


Dabei seit: 04.01.2013
Beiträge: 2.859

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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;
}


__________________
Syntax Highlighting fürs Board (Link)
16.11.2016 20:14 eulerscheZahl ist offline Beiträge von eulerscheZahl suchen Nehmen Sie eulerscheZahl in Ihre Freundesliste auf
Willinator
Grünschnabel


Dabei seit: 16.11.2016
Beiträge: 8

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

danke. jedoch darf ich laut meinem Prof nicht die #include <cstdlib> benutzen da wir die nicht hatten. ich darf nur die zwei anderen verwenden....
16.11.2016 20:42 Willinator ist offline Beiträge von Willinator suchen Nehmen Sie Willinator in Ihre Freundesliste auf
eulerscheZahl eulerscheZahl ist männlich
Foren Gott


Dabei seit: 04.01.2013
Beiträge: 2.859

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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.

__________________
Syntax Highlighting fürs Board (Link)
16.11.2016 20:49 eulerscheZahl ist offline Beiträge von eulerscheZahl suchen Nehmen Sie eulerscheZahl in Ihre Freundesliste auf
Willinator
Grünschnabel


Dabei seit: 16.11.2016
Beiträge: 8

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

habs noch mal in der codeansicht gemacht großes Grinsen

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Willinator: 16.11.2016 21:09.

16.11.2016 21:01 Willinator ist offline Beiträge von Willinator suchen Nehmen Sie Willinator in Ihre Freundesliste auf
Willinator
Grünschnabel


Dabei seit: 16.11.2016
Beiträge: 8

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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;
}
16.11.2016 21:08 Willinator ist offline Beiträge von Willinator suchen Nehmen Sie Willinator in Ihre Freundesliste auf
eulerscheZahl eulerscheZahl ist männlich
Foren Gott


Dabei seit: 04.01.2013
Beiträge: 2.859

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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?

__________________
Syntax Highlighting fürs Board (Link)
16.11.2016 21:09 eulerscheZahl ist offline Beiträge von eulerscheZahl suchen Nehmen Sie eulerscheZahl in Ihre Freundesliste auf
Willinator
Grünschnabel


Dabei seit: 16.11.2016
Beiträge: 8

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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.
16.11.2016 21:16 Willinator ist offline Beiträge von Willinator suchen Nehmen Sie Willinator in Ihre Freundesliste auf
eulerscheZahl eulerscheZahl ist männlich
Foren Gott


Dabei seit: 04.01.2013
Beiträge: 2.859

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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.

__________________
Syntax Highlighting fürs Board (Link)
16.11.2016 21:24 eulerscheZahl ist offline Beiträge von eulerscheZahl suchen Nehmen Sie eulerscheZahl in Ihre Freundesliste auf
Willinator
Grünschnabel


Dabei seit: 16.11.2016
Beiträge: 8

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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.
16.11.2016 21:30 Willinator ist offline Beiträge von Willinator suchen Nehmen Sie Willinator in Ihre Freundesliste auf
eulerscheZahl eulerscheZahl ist männlich
Foren Gott


Dabei seit: 04.01.2013
Beiträge: 2.859

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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)

__________________
Syntax Highlighting fürs Board (Link)
16.11.2016 21:41 eulerscheZahl ist offline Beiträge von eulerscheZahl suchen Nehmen Sie eulerscheZahl in Ihre Freundesliste auf
Willinator
Grünschnabel


Dabei seit: 16.11.2016
Beiträge: 8

Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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
16.11.2016 21:53 Willinator ist offline Beiträge von Willinator suchen Nehmen Sie Willinator in Ihre Freundesliste auf
Baumstruktur | Brettstruktur
Gehe zu:
Neues Thema erstellen Antwort erstellen
Informatiker Board » Themengebiete » Praktische Informatik » Anzahl der Primfaktoren einer Zahl