Vollständige Version anzeigen : Primfaktorzerlegung in C


Bumblebe3
06.05.2015, 15:57

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?



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

Hardware Preisvergleich | Amazon Blitzangebote!

Videos zum Thema
Video Loading...
raid-rush
07.05.2015, 09:30

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.


Bumblebe3
07.05.2015, 11:11

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!




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


raid-rush
07.05.2015, 13:13

Ä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.


Bumblebe3
07.05.2015, 13:16

Oh ja du hast recht :D 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?


m00pd00p
07.05.2015, 13:31

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.


Bumblebe3
07.05.2015, 13:41

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 ?!


Bumblebe3
15.05.2015, 09:37



#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?


Ähnliche Themen zu Primfaktorzerlegung in C
  • [Java] Problem mit Primfaktorzerlegung
    Moin RR, ich habe ein Problem mit der Primfaktorzerlegung. Meine Ansätze sind immer gescheitert, einfach deshalb, weil ich den Code nicht realisiert bekomme. Meine Überlegungen waren: bsp. Primfaktoren bis 10: 2, 3, 4, 5, 6, 7, 8, 9, 10 -> Alle Zahlen durch 2 teilen wenn kein Rest raus kommt " [...]

  • [Java] Primfaktorzerlegung
    Nabend, ich brauche mal Hilfe bei einem Algorithmus. Ich komme irgendwie nicht weiter. Ich bin ziemlich neu in Java und beschäftige mich auch nur damit wegen meines Studiums. Das ist also die Aufgabe die ich bis morgen erledigt haben muss: Schreiben Sie ein Java-Programm, das zwei Zahlen vom Ty [...]



raid-rush.ws | Imprint & Contact pr