Primfaktorzerlegung in C

Dieses Thema im Forum "Programmierung & Entwicklung" wurde erstellt von Bumblebe3, 6. Mai 2015 .

  1. 6. Mai 2015
    Hab mir folgenden Code geschrieben, nur hab ich das Problem, dass er mir bei z.B. 99 sagt es sei eine Primzahl was sie aber nicht ist? Kann einer den Fehler sehen?

    Code:
    
    #include <stdio.h>
    #include <math.h>
    
    int isprim(unsigned long z)
    {
     unsigned long i;
     for(i=2; i<=z/2; i++)
     {
     if(!(z%i))
     {
     return 0;
     }
     }
     return 1;
    }
    
    int main(void)
    {
     unsigned long z, i;
     printf("Zahl:");
     scanf("%d",&z);
     printf("%d\n", z);
     
     while(z>1)
     {
     i=2;
     while(1)
     {
     if(!(z%i) && isprim(i))
     {
     printf("%d ist prim. \n", z);
     z/=i;
     break;
     }
     i++;
     }
     }
     
     /* Wenn z < 2 ist, dann Fehlermeldung */
     
     while (z<2)
     {
     printf("%d kann nicht zerlegt werden. \n", z);
     break;
     
     } 
     
     system("PAUSE");
     return 0;
    } 
    
     
  2. 7. Mai 2015
    AW: Primfaktorzerlegung in C

    if(!(z%i)){return 0}

    wenn du 99 durch 9 teilst kommt Rest 0 mit dem ! invert = 1 bedeutet return 0.
    das würde stimmen. Aber das ist nicht die einzige Zahl...


    while(1)
    {
    if(!(z%i) && isprim(i))
    {
    printf("%d ist prim. \n", z);
    z/=i;
    break;
    }
    i++;
    }

    das ist eine endlosschleife, wenn die eingabe keine Primezahl ist wird er immer && 0 haben. Also liegt der Fehler im isprim. Der gibt zwischenzeitlich auch mal 1 zurück und zwar bei jeder geraden Zahl. Bau dir mal einen printf in die Schleife ein beim isprim, um zu sehen wie weit er eigentlich läuft.
     
  3. 7. Mai 2015
    AW: Primfaktorzerlegung in C

    Ich habs jetzt mal anders geschrieben aber ich hab immer noch einen Fehler drin :angry:
    Die Formartierung passt nicht, da die erste Zahl immer zu weit links ist! Warum? und wenn ich 2 eingebe sagt er mir es ist eine Primzahl :lol:

    Das Programm soll eben genau eine Variable einlesen und die Primfaktoren untereinander ausgeben. Im Falle einer Primzahl soll der text "ist eine Primzahl" ausgegeben werden! Im Fehlerfall, also wenn die Zahl < 2 ist soll ausgegeben werden, dass sie nicht zerlegt werden kann!


    Code:
    
    #include <stdio.h>
    
    int main()
    {
     
     int n,i, flag = 0; 
     printf("Zahl: "); 
     scanf("%d", &n);
     
     printf("%d\n", n);
     
     i = 2;
     
     while(n!=0)
     {
     if(n%i!=0)
     i++;
     else
     {
     n = n / i;
     printf("%d ist prim. \n ", i);
     if(n==1)
     break;
     }
     }
     
     for(i = 2; i <=n/2; i++) //Check ob Primzahl oder nicht
     {
     if (n%i == 0)
     {
     
     printf("%d kann nicht zerlegt werden. \n", n);
     break;
     }
     }
     if (n == i)
     printf ("%d ist Prim. \n", n);
     else
     printf("%d ist keine Primzahl \n",n);
     
     system("PAUSE");
     return 0;
    }
    
     
  4. 7. Mai 2015
    AW: Primfaktorzerlegung in C

    Ähm 2 ist eine Primzahl ^^ zumindest derzeit noch, vermutlich ist es aber nur ein logischer Zufall das sie eine ist, weil sie es keine kleinere Zahl als 1 gibt durch die sie teilbar wäre.

    Das Leerzeichen hier am Ende nach \n ist zu viel printf("%d ist prim. \n ", i); deshalb hat die nächste Zeile mit der Zahl ein Leerzeichen vorne.
     
  5. 7. Mai 2015
    AW: Primfaktorzerlegung in C

    Oh ja du hast recht lol aber wenn ich 1 eingebe passiert gar nix. Gebe ich allerdings 5 ein dann kommt 5 ist eine Primzahl und darunter 1 ist keine Primzahl. Wie mach ich das weg? Also das er dann in dem Fall sagt 1 ist keine Primzahl?
     
  6. 7. Mai 2015
    AW: Primfaktorzerlegung in C

    Nicht die erste Ausgabe ist zu weit links, sondern alle anderen zu weit rechts, weil du nach der ersten Ausgabe immer noch ein Leerzeichen ausgibst nach dem Zeilenumbruch.
    printf("%d ist prim. \n ", i);

    Ansonsten macht das Ding gar nichts mehr, wenn ich 1 eingebe und gibt mir bei der Zerlegung am Ende immer die 1 noch aus.
     
  7. 7. Mai 2015
    AW: Primfaktorzerlegung in C

    Die Leerzeichen habe ich raus aber die Formatierung passt immer noch nicht :/ Ich möchte eigentlich nicht, dass er am Ende noch die 1 ausgibt :/

    Was würdet ihr noch ändern an dem Code?

    edit: Ok habs gefunden Bleibt nur die Frage ob das Programm so in Ordnung ist? Das Programm soll im Fehlerfall (z < 2) den Text "... kann nicht zerlegt werden" ausgeben. Aber das macht es nicht ?!
     
  8. 15. Mai 2015
    AW: Primfaktorzerlegung in C

    Code:
     
    #include <stdio.h>
    #include <math.h>
     
    int primfaktor(int n)
    {
     int i;
     
     while (n%2 == 0)
     {
     printf("%d ", 2);
     n = n/2;
     }
     
     
     for (i = 3; i <= sqrt(n); i = i+2)
     {
     
     while (n%i == 0)
     {
     printf("%d ", i);
     n = n/i;
     }
     }
     
     
     if (n > 2)
     printf ("%d ", n);
    }
    int main()
    {
     int pf;
     
     while ((pf = primfaktor (12))> 1)
     printf ("%d\n", pf);
     while ((pf = primfaktor(7)) > 1)
     printf ("%d\n", pf);
     printf ("%d\n" , primfaktor (1));
     system("PAUSE");
     return 0;
     
    }
     
    
    Ich habe folgende Rahmenbedingungen:

    - keine globalen Variablen
    - innerhalb der Funktion keine Ein- und Ausgabe erlaubt
    - die Kommunikation muss über die Schnittstelle erfolgen

    Also das Programm mit der Primfaktorzerlegung muss in folgende Schnittstelle gepackt werden:
    int primfaktor ( int );

    Die Funktion gibt bei jedem Funktionsaufruf mit einem Parameter n den nächsten Primfaktor von n
    zurück (also numerisch aufsteigend, mehrfach vorkommende Faktoren werden auch mehrfach zurückgegeben). Sobald sich der Wert der übergebenen Zahl n ändert beginnt die Funktion wieder von vorne mit der Primfaktorzerlegung. Hat die Funktion alle Primfaktoren für ein n errechnet und zurückgegegeben so gibt sie (bis zum Aufruf mit einem neuen Wert n) immer -1 zurück.

    Im Fehlerfall gibt die Funktion immer den Wert -2 zurück.

    Mir fehlt jetzt eigentlich nur noch das mit -1 und mit -2 aber wie bau ich das noch ein?
     
  9. 17. Mai 2017
    Zuletzt von einem Moderator bearbeitet: 17. Mai 2017
    Eben gegoogelt: Problem: Primfaktorzerlegung mit while-Schleife

    Code:
    /*Primfaktorzerlegung*/
    # include<stdio.h>
    
    int main (void)
    {
    int x, a=2;
    
    printf("Geben Sie eine natuerliche Zahl ein: ");
    scanf("%d", &x);
    
    if ((x==0) || (x==1))
    {
    printf("Werteingabe unzulaessig, da x nicht 0 oder 1 sein darf.");
    }
    
    else
    {
    while (x%a!=0){a++;}
    while (x%a==0)
    {
    x=x/a;
    printf("%d,", a);
    while (x%a!=0){a++;}
    }
    
    if (x%a!=0)
    {
    a++;
    x=x/a;
    printf("%d,", a);
    a++;
    }
    }
    return 0;
    } 
     
  10. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.