# Primfaktorzerlegung mit String Eingabe



## Kiss-Guba (4. November 2004)

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


----------



## volldepp (8. Dezember 2004)

Hallo, ich hoffe es hilft

```
// 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");**/
}
```


----------



## Cherry07 (25. November 2007)

volldepp hat gesagt.:


> ```
> // Beginn mit des Suche nache der ersten Zahl
> while (!isdigit(bereich[i]) && i<strlen(bereich))
> i++;
> ...



Hallo,
kann mir mal jemand denn Ausdruck 
	
	
	



```
zahl1 = zahl1 * 10 + (int)bereich[i] - (int)'0';
```
in dieser Schleife erklären?
Kann man es auch anders schreiben?
Wie z.B. 
	
	
	



```
zahl1=bereich[i]?
```


Gruß
Cherry07


----------



## da_raff (24. November 2008)

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?

```
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 " 
	
	
	



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


----------



## devDevil (24. November 2008)

willst du es in c oder c++ umsetzen? in c++ is das da oben eine verdammt mieße ausführung -.-


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

```
(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:

```
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


----------



## da_raff (24. November 2008)

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


----------



## deepthroat (24. November 2008)

Hi.





da_raff hat gesagt.:


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


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

Gruß


----------



## da_raff (24. November 2008)

Achsoo ok, also hätte "zahl" in deinem beispiel nun den wert 55 oder? 
also wenn das stimmt dann vielen Dank für die Hilfe!


----------



## deepthroat (24. November 2008)

da_raff hat gesagt.:


> Achsoo ok, also hätte "zahl" in deinem beispiel nun den wert 55 oder?
> also wenn das stimmt dann vielen Dank für die Hilfe!


Ja, 55 ist richtig.


----------

