Primfaktorzerlegung mit String Eingabe

Kiss-Guba

Grünschnabel
Hallo,

ich suche nach einem Code der folgendes ausübt:

Es soll eine Primfaktorzerlegung für entweder eine Zahl oder einen Zahlenbereich gemacht werden. Wichtig dabei ist das die Eingabe in einem String gespeichert wird und dass das Programm selber entscheidet ob die Eingabe eine Zahl, zwei Zahlen für den Zahlenbereich oder eine ungültige Eingabe bekommen hat! Je nach dem soll das Programm die Primfaktorzerlegung verrichten. Die richtige Eingabe für einen Zahlenbereich soll durch ein Komma getrennt eingegeben werden!

Freue mich über Antworten,
Danke

Kiss-Guba
 
Hallo, ich hoffe es hilft
Code:
// Dies ist ein Progamm um Zahlen in einem Zahlenbereich in ihre Primfaktoren zu zerlegen
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
 

void main(void)
 
{
 
int zahl1=0,zahl2=0,a=2,produkt=1,div,ende,zahl;
int i; //Indexvariable
char bereich[100]; 
 
i=0;
 
 
printf("\n\nGeben Sie zwei Zahlen durch ein Leerzeichen getrennt ein ");
printf("\nWollen Sie Zahlen in einem Bereich zerlegen, \nmuessen die Zahlen groesser 1 sein: ");
gets(bereich); // Eingabe des Zahlenbereichs
 
// Beginn mit des Suche nache der ersten Zahl
while (!isdigit(bereich[i]) && i<strlen(bereich))
i++;
 
while (isdigit(bereich[i]) && i< strlen(bereich))
{
zahl1 = zahl1 * 10 + (int)bereich[i] - (int)'0';
i++;
}
 
// Suche nach der Leerstelle 
while (!isdigit(bereich[i]) && i<strlen(bereich))
i++;
 
// Suche nach der zweiten Zahl
while (isdigit(bereich[i]) && i< strlen(bereich)){
zahl2 = zahl2 * 10 + (int)bereich[i] - (int)'0';
i++;
}
 
// Variablen nach Größe der zwei Zahlen für die Primzahlzerlegung zuordnen
if (zahl2 == 0 || zahl2 == 1)
zahl2 = zahl1;
if (zahl1 == 0 || zahl1 == 1)
zahl1 = zahl2;
if (zahl1 >= zahl2){
zahl = zahl2;
ende = zahl1;}
if (zahl1 < zahl2){
zahl = zahl1;
ende = zahl2;}
if (zahl <= 1 )
printf("\nMindestens eine Zahl muss groesser als 1 sein!\n");
 
// Primzahlzerlegung
while(zahl <= ende && zahl > 1){
div = zahl;
printf("\n%d = ",zahl);
 
while (produkt != zahl){
 
while (div%a == 0){
div=div/a;
produkt=produkt*a;
if (produkt != zahl)
printf(" %d *",a);
else 
printf(" %d ",a);
}
a++;
 
}
zahl++;
a=2;
produkt = 1;
}
/**system("pause");**/
}
 
Code:
// Beginn mit des Suche nache der ersten Zahl
while (!isdigit(bereich[i]) && i<strlen(bereich))
i++;
 
while (isdigit(bereich[i]) && i< strlen(bereich))
{
zahl1 = zahl1 * 10 + (int)bereich[i] - (int)'0';
i++;
}
 
}

Hallo,
kann mir mal jemand denn Ausdruck
Code:
zahl1 = zahl1 * 10 + (int)bereich[i] - (int)'0';
in dieser Schleife erklären?
Kann man es auch anders schreiben?
Wie z.B.
Code:
zahl1=bereich[i]?


Gruß
Cherry07
 
Hallo,
hab ein bischen gegooglet und dann in diesem Forum dieses Thema gefunden.
Hier kam leider keine Antwort auf die letzte Frage und genau diese Antwort hätte ich auch gerne ^^.
Könnte sich das nochmal jemand ansehen und mir den Teil mit der Suche nach der 1. bzw 2. Zahl (das Prinzip ist ja das selbe) erklären?
Code:
while (!isdigit(bereich[i]) && i<strlen(bereich)){
		i++;
}
while (isdigit(bereich[i]) && i< strlen(bereich)){
    zahl1 = zahl1 * 10 + (int)bereich[i] - (int)'0';
		i++;
}


die erste while-Schleife ist nur dazu gedacht um Buchstaben oder andere Zeichen in der Zeichenkette zu finden oder?
Der Schritt "
Code:
zahl1 = zahl1 * 10 + (int)bereich[i] - (int)'0';
" ist mir etwas unklar. was bedeutet es, wenn "int" in Klammern steht und was bedeutet dann " (int)'0' "?

eine Antwort würde mir sehr weiterhelfen, danke.
 
Zuletzt bearbeitet:
willst du es in c oder c++ umsetzen? in c++ is das da oben eine verdammt mieße ausführung -.-

C++:
 zahl1 = zahl1 * 10 + (int)bereich[i] - (int)'0';
Das bedeutet folgendes:
Im ASCII-Zeichensatz befindet sich das '0' Zeichen als erstes Zeichen einer Zeichenfolge, dann das '1'. Allerdings ist '0' nicht das erste Zeichen der ASCII-Tabelle!
C++:
(int)bereich[i]
C-Style-Cast des Zeichens an Stelle i in eine Zahl, das entspricht der im ASCII-Zeichensatz dem Zeichenzugeodneten Zahl. Da er vorher wahrscheinlich überprüft ob das Zeichen an der Stelle i eine Nummer ist, kann er nun davon ausgehen, dass wenn er die der Zahl 0 zugeordneten Zahl abzieht, er einen Int mit dem Wert des Zeichens bekommt ;) Man könnte daraus auch ne Funktion char_to_integer machen ;)
Wenn an der Stelle i z.B. ne '4' ist, entspricht dies im ASCII-Zeichensatz der 52. Die '0' der 48. 52 - 48 entspricht der gesuchten 4 (als Integer!).

Der rest sollte klar sein:
C++:
zahl1 = zahl1 * 10 + char_to_int(bereich[i]);
Die bisherige Zahl einfach eine Stelle nach vorne schieben (du rechnest hier im 10er System) und dann die neue Ziffer hinzuaddieren ;)
 
Hi,
erstmal danke für die schnelle Antwort :-)

Also ich möchte das ganze in C umsetzen.
Im ASCII-Zeichensatz befindet sich das '0' Zeichen als erstes Zeichen einer Zeichenfolge, dann das '1'. Allerdings ist '0' nicht das erste Zeichen der ASCII-Tabelle!

Ahja, sehr gut das hat mir schonmal weitergeholfen aber was bedeutet dann der vordere Teil der Rechnung: "zahl1=zahl1*10+..."

Wie errechnet das Programm eine Zahl, wenn in der Formel die gesuchte Zahl selber steckt?
Sorry, bin noch nicht so fit im programmieren und deshalb für die meißten vllt überflüssige Fragen ^^.
 
Hi.
Ahja, sehr gut das hat mir schonmal weitergeholfen aber was bedeutet dann der vordere Teil der Rechnung: "zahl1=zahl1*10+..."

Wie errechnet das Programm eine Zahl, wenn in der Formel die gesuchte Zahl selber steckt?
Das ist keine math. Formel! Variablen in C/C++ sind nur Behälter für Werte. D.h. was diese Zuweisung dort eigentlich bedeutet ist: Der Wert der Variablen zahl1 soll der Wert des Ausdrucks auf der rechten Seite des Gleichheitszeichens sein. Also muss zuerst der Wert der rechten Seite berechnet werden. Dieser Wert berechnet sich aus dem Wert der Variablen multipliziert mit 10 addiert zu ... usw.

C:
int zahl = 5;
zahl = zahl * 10 + 5;
Welchen Wert hat die Variable zahl nach der letzten Anweisung?

Gruß
 
Zurück