Primfaktorzerlegung in c

Status
Für weitere Antworten geschlossen.

Jack2000

Newbie
Registriert
Juni 2021
Beiträge
4
Guten Tag ! Ich habe bezüglich meines Studiums die Aufgabe ein Programm zum Thema Primfaktorzerlegung zu schreiben. Mein Problem ist nun, dass die Ausgabe wie folgt aussieht bsp: 20=2*2*5* gewünscht ist aber die Ausgabe 20=2*2*5 (ohne den letzten Mal Operator). Außerdem ist das Programm nicht gerade "kompakt". Danke schonmal im Voraus.




C:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

long long kteiler(long long n)
{
        
    long long teiler;
    long long max;
    if(n<=4)
    {
        return n;
    }
    else if(n%2==0)
    {
        return 2;
    }
    teiler=3;
    max=sqrt(n)+1;
    while(n%teiler!=0)
    {
    teiler +=2;
    if(teiler>max)
    {
        teiler= n;
        break;
    }
}
    return teiler;
}

    

void prim(long long n)
{
    long long erg=1;
    long long teiler;
    printf("%d=",n);
    
    teiler=kteiler(n);
    erg=n/teiler;
    printf("%d*",teiler);
    
    while(teiler!=1){
        teiler=kteiler(erg);
        erg=erg/teiler;
    if(teiler==1)
    {
        break;
    }
    printf("%d",teiler);
    if(teiler)
    printf("*");
    }
    
}

int main() {
    long long i;
    long long teiler=1;
    long long erg;
    printf("Geben sie eine Zahl groesser 0 ein\n");
    printf("Bei der Eingabe von 0 wird das Programm beendet\n");
    scanf("%lld",&i);
    if(i==0)
    return 0;
    else
    prim(i);

    
    
    
    return 0;
}
 
Zuletzt bearbeitet:
Hausaufgabenfragen sind nicht gern gesehen, aber du hast wenigstens Quellcode gepostet - wenn auch nicht in den dafür vorgesehen Code-Tags - daher trotzdem ein Kommentar:

Lösungen gibt es viele. Ohne jetzt konkret deinen Quellcode durchgesehen zu haben, weil das nicht-eingerückt einfach nur anstrengend ist, könnte eine simple Lösung sein, jeweils *x auszugeben statt x*. Statt einer direkten Ausgabe könnte man sich das Ergebnis auch an einen Ergebnis-String anhängen und bei diesem einfach das letzte Zeichen abschneiden. Oder man macht es ganz anders und arbeitet mit einer Rekursion.
 
Die Typenkennzeichen für printf() bzw. scanf() sind falsch.

Anhand Deiner Frage entsteht bei mir die Vermutung, dass Du den bestehenden Code nicht selbst geschrieben hast. Ist das korrekt?

C:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

long long kteiler (long long n)
{

    long long teiler;
    long long max;
    
    if (n <= 4)
    {
        return n;
    }
    else if (n % 2 == 0)
    {
        return 2;
    }
    
    teiler = 3;
    max = sqrt(n) + 1;

    while (n % teiler != 0)
    {
        teiler = teiler + 2;
        if (teiler > max)
	    {
            teiler = n;
            break;
	    }
    }

    return teiler;
}

void prim (long long n)
{
    long long erg = 1;
    long long teiler;
    printf ("%llu = ", n);

    teiler = kteiler (n);
    erg = n / teiler;
    printf ("%llu", teiler);

    while (teiler != 1)
    {
        teiler = kteiler (erg);
        erg = erg / teiler;
        if (teiler == 1) break;
        
        printf (" * %llu", teiler);
    }
}

int main ()
{
    long long i;
    long long teiler = 1;
    long long erg;
    
    printf ("Geben Sie eine Zahl groesser 0 ein.\n");
    printf ("Bei der Eingabe von '0' wird das Programm beendet.\n");
    scanf ("%lld", &i);
    
    if (i == 0) return 0; else prim (i);

    return 0;
}
 
Status
Für weitere Antworten geschlossen.
Zurück
Oben