C Primfaktorzerlegung

MySt3rY

Cadet 4th Year
Registriert
Dez. 2008
Beiträge
126
Ich soll eine Primfaktorzerlegung in C programmieren. Dabei soll noch überprüft werden, ob der gefunde Faktor nochmal auftritt. Mein bisheriges Program läuft mehr oder weniger gut...
Ein Problem ist, dass bei der Eingabe von 35 mir das Programm 5*6 anzeigt, quasi die 6 nichtmehr weiter zerlegt. Es müsste 2*3*5 sein.
Das zweite Problem die Eingabe von 72 bringt die Ausgabe von 2*2*3*3..Irgendwo "verschluckt" das Programm die letzte zwei. Es müsste eigentlich 2*2*2*3*3 ergeben.
Ich habe noch nicht so die Erfahrung beim Programmieren :(..Über jede Hilfe würde ich mich freuen ;)
Code:
#include <stdio.h>
int zahl,i=2;

int main (void) {

printf("Bitte geben Sie eine Zahl ein\n");
scanf("%i",&zahl);

if(zahl==1 || zahl==0) {
	printf("Größere Zahl eingeben");
}else {
    while (zahl%i!=0){     /*Schleife für ungerade Zahlen*/
                i++;
                     }
    while(zahl%i==0) {
        while (i<zahl){
		zahl=zahl/i;
		   if(zahl%i==0){                /*Prüfe, ob der gefundene Faktor nochmal auftritt*/
				zahl=zahl/i;
				printf("%i*",i);
				}
		printf("%i*",i);
		i++;		
                     
		      }
                  }
}

return 0;
}
 
In Z18 prüfst du ja mit dem erhöhtem i-Wert.
Im Falle von 35 prüfst du ob 6 durch 5 teilbar ist, müsstest aber prüfen ob 6 durch 2 teilbar ist.
 
Ich habe mir mal erlaubt, deinen Code etwas aufzuräumen:

Code:
#include <stdio.h>
 
int main (void) {
    int zahl = 0;
    printf("Bitte geben Sie eine Zahl ein\n");
    scanf("%i",&zahl);
     
    if (zahl < 2) {
        printf("Größere Zahl eingeben\n");
    } else {
        int i = 2;
        /*Schleife für ungerade Zahlen*/
        while (zahl%i != 0) {
            i++;
        }
        while (zahl%i == 0) {
            while (i < zahl) {
                zahl /= i;
                /*Prüfe, ob der gefundene Faktor nochmal auftritt*/
                if (zahl%i == 0) {
                    zahl /= i;
                    printf("%i*",i);
                }
                printf("%i*",i);
                i++;
            }
        }
    }
    return 0;
}

Code:
while (i < zahl)
Muss zur äußeren Schleife werden muss. Dann sollte es eigentlich schon funktionieren.


Kurz und knackig:

Code:
#include <stdio.h>
 
int main (void) {
    int zahl = 0;
    while (zahl < 2) {
        printf("Bitte geben Sie eine Zahl größer 1 ein\n");
        scanf("%i",&zahl);
    }
     
    int i = 2;
    while (i < zahl) {
        while (zahl%i != 0) {
            i++;
        }
        while (zahl%i == 0) {
            zahl /= i;
            printf("%i*",i);
        }
    }

    return 0;
}
 
Zuletzt bearbeitet:
Generellen Tips:
- Kommentare im Code kosten nichts, sie machen es aber für Aussenstehende deutlich einfacher deinen Code zu verstehen. Und auch für dich selbst wenn du dienen eigenen Code 1 Jahr später nochmal verstehen möchtest.
- Die Einrückungen so aufbauen das man erkennt wo welcher Code Block endet.

0-8-15 User hat eines der Probleme schon gefunden.
Ich sehe ein anderes Problem in Zeile 17, du teilst immer durch i ohne zu wissen ob es wirklich ein Primfaktor ist und speicherst es direkt in deine Variable.
Die Logik von Zeile 12-15 kann man auch in die letzte while Loop einbauen, dann wird das Programm nicht so verschachtelt und unübersichtlich.

Zusätzlich Fragen die du dir stellen solltest, um dich tiefer in C einzuarbeiten (damit du selbst die Probleme entdecken kannst):
- Warum wurden zahl und i als globale Variablen angelegt und nicht lokal in main? (hier kein gravierendes Problem)
- Wieso wurde der Datentyp int für für zahl und i gewählt?

Edit:
Mist ich hätte nicht zwischendurch Kaffee machen sollen :D
 
Zuletzt bearbeitet:
würde das ganze noch etwas vereinfachen:

Code:
#include <stdio.h>


int main(void)
{
    int zahl = 0;
    int i = 2;


    while (zahl < 2)
    {
        printf("Bitte geben Sie eine Zahl (2 oder größer) ein: ");
        scanf("%i", &zahl);
    }


    while (i <= zahl)
    {
        if (zahl%i == 0)
        {
            printf("%i*", i);
            zahl /= i;
        }
        else
            i++;
    }


    return 0;
}
 
@0-8-15 User Danke ;)
@RippingBull Vielen Dank für deine Hinweise! Ich werde mir deine Tipps merken! Dadrauf wurde näturlich hingewiesen, aber sowas vergisst man gerne wieder schnell :(
@Zorxx Wow, ich hätte nicht gedacht, dass man es auf soviele Zeilen Code reduzieren kann...Bist mein Held des Tages. Vielen Dank! :D
 
Zurück
Oben