Primfaktor

bvb2307

Grünschnabel
Hallo ich habe ein Problem ich hatte die Aufgabe die Zahlen von 1-20 wiederzugeben und auch die Summe aller Zeilennummern bis zur aktuellen dieses habe ich bereits geschaft aber als 3tes sollte ich den größten Primfaktor der Summe ausgeben also Spalte drei wie mache ich das****

txn3xeq5.png
Das ist mein aktueller Quellcode.


Danke schonmal im vorraus!
MFG
 
Die Überprüfung ob eine Zahl eine Primzahl ist, nehme ich einmal an kannst du? Also du musst nur überprüfung, ob diese Zahl irgendwelche anderen Teiler außer sich selbst und 1 hat. Wenn nicht, ist es eine Primzahl. Wenn du eine Primzahl gefunden hast, speicherst du sie in die Variable prim. Und du überprüfst jetzt alle Zahlen von 2 bis zu sum darauf, ob sie Primzahlen sind, und wenn du eine findest speicherst du sie in prim. Am Ende steht dann der größte Primfaktor von sum in prim.

Lg
 
DAnke, schonmal ich überprüfe jetzt ob es eine Primzahl ist aber wie mach ich das mit dem Rechnen siehe Bild? Hast vielleich ein Code Schnipsel?
MFG
Primzahl.png
 
Hi

Kleine Anmerkung zum Forum:
Warum postest du den Code nicht als Text direkt in den Forenbeitrag?
Würde für alle einfacher sein.

Zum Problem:
a) Du suchst irgendeine möglichst große ganze Zahl x: 2 <= x <= Summe (oder was auch immer)
Also von der Summe eine Zählschleife abwärts, stopp bei 2
b) Diese Zahl x muss eine Primzahl sein: isPrim
c) Wenn b erfüllt ist muss auch noch geprüft werden, ob Summe%x==0
Wenn so eine Zahl gefunden wird, fertig, ausgeben
 
C++:
#include "stdafx.h"

bool isPrim (int N);

int _tmain(int argc, _TCHAR* argv[])
{
		printf ("Hallo Welt\n\n");										// Ausgabe Hallo Welt

	int znr, sum, prim;													// Einlesen der Variablen Zeilennummer, Summe der Zeilennummer, Primfaktor
	sum=0;	
    prim=0;
	int x=0;

		for (znr = 2; znr <= 20; znr++)									//ab Zeilennummer 2 bis 20
		{
			sum = sum + znr;											//Summe ergibt sich aus Summe plus Zeilennummer
			printf("%d %d", znr, sum);									//Ausgabe der Variablen
				if (isPrim (sum))
				printf(" %d", sum);
				else
					
				for (x=sum; x >=3;)
					prim=sum/x;
				  
					if(isPrim(prim))
					printf("%d", prim);

					else
						x--;
					printf("\n");
		}

	getc(stdin); getc(stdin);											//Text"Beliebige Taste drücken ausblenden"
	return 0;
}

bool isPrim (int N)

{
	int pT = 2;
	while (pT * pT <= N)
	{
		if (N % pT == 0)
			return false;
		pT++;
	}
	return true;
}

Es klappt bei mir nicht mit dem runterzählen****
MFG
 
Bitte Codetags verwenden.

Würde außerdem vorschlagen, die Faktorermittlung in eine eigene Funktion zu packen
und das main erst mal zu vergessen. Das verwirrt nämlich.

C++:
unsigned int biggestPrimfaktor(unsigned int n)
{
   ....
}
Zur for-Schleife: Du zählst nur runter, wenns keine Primzahl ist.
Wenn du grade bei einer Primzahl bist bleibst du ewig dort stecken.
Mach das Runterzählen einfach in die for()-Anweisung.
 
Code:
#include "stdafx.h"

bool isPrim(int N);
int PrimZer(int N);

int _tmain(int argc, _TCHAR* argv[])
{
		printf ("Hallo Welt\n\n");											// Ausgabe Hallo Welt

		int znr, sum, prim;													// Einlesen der Variablen Zeilennummer, Summe der Zeilennummer, Primfaktor
		prim=0, sum=0;

			for (znr = 2; znr <= 20; znr++)									//ab Zeilennummer 2 bis 20
		{
			sum = sum + znr;												//Summe ergibt sich aus Summe plus Zeilennummer
			printf("%d %d %d\n", znr, sum, PrimZer(sum));					//Ausgabe der Variablen
		}

	getchar();																//Text"Beliebige Taste drücken ausblenden"
	return 0;
}

	bool isPrim(int N)														//Variable N einlesen									
{ 
	int pT = 2;																// Variable pT einlesen und Wert 2 geben
	while (pT * pT <= N)													// pT mal pT soll kleiner gleich N sein
	{
		if (N % pT == 0)													//wenn N Modulo pT Null ist
			return false;													//springe zurück
		pT++;																//erhöhe pt um 1
	}
}	

	int PrimZer(int N)														//Variable Prim und N einlesen
{
		int i = 2;																
		while (N % i == 0)
	{
		if (isPrim(N))
			return N;
			N = N/i;	
	}
		i++;
		while (N % i ==0)
	{
		if (isPrim(N))
			return N;
		N = N/i;
	}
		i = 5;
		while (N % i ==0)
	{
		if (isPrim(N))
			return N;
		N = N/i;
	}
		return N;
}

Klappt super, außer das er bei den Zahlen 77,119,209 keine Primzahlzerlegung macht woran kann das liegen?
MFG
 
Etwas zu isPrim:
Wenn du in der Schleife merkst, dass N durch das aktuelle pT teilbar ist,
gibst du false zurück. OK. Aber wenn du ohne Fund aus der Schleife wieder rauskommst
müsste da ja eigentlich true zurückgegeben werden? Was da ohne passiert...?
Warnt der Compiler da nicht?

Und primZer...was machst du da :suspekt:
Es gibt noch mehr außer 2-3-5...
Probier das doch mal, so schwer ist das nicht:
a) Du suchst irgendeine möglichst große ganze Zahl x: 2 <= x <= Summe (oder was auch immer)
Also von der Summe eine Zählschleife abwärts, stopp bei 2
b) Diese Zahl x muss eine Primzahl sein: isPrim
c) Wenn b erfüllt ist muss auch noch geprüft werden, ob Summe%x==0
Wenn so eine Zahl gefunden wird, fertig, ausgeben
 
Zurück