# Quersumme und Dezimalzahlen



## Desertrose (23. Nov 2006)

Hallo, 

habe heute bisschen programmiert unter anderem "quersumme". Zum Beispiel (long n=1234 ist 10). So dann habe ich den Algoritmus einfacherweise so geschrieben dass jede Zahl addiert wird (1+2+3+4). Jetzt sehe ich ein anderen Algoritmus und der dividiert die Zahlen mit 10 , und modulu 10... so:

class quersumme{
    public static void main(String[] args) {
        int z = 123456, n = z, querSumme = 0;
        while (n != 0) {
            querSumme += n%10;
            n /= 10;
        }
        System.out.println(n + " hat als Quersumme " + querSumme);
    }
}

n/=10 --> da wird ja z immer um 1 Ziffer reduziert. Wieso macht man das nicht einfach, so dass man die zahlen einfach addiert?
Und was ist der Unterschied wenn auf einem Aufgabenblatt steht :schreiben Sie ein Programm dass Zahlen einliest bzw. Dezimalzahlen?? Sorry, bin da jetzt etwas verwirrt...

gruß
Desertrose


----------



## merxleben (23. Nov 2006)

Hi,

schau dir einfachmal die Zwischenergebnisse der einzelnen Schritte an, dann wirst du feststellen, dass dieser Algorithmus auch nichts anderes macht als die einzelnen Ziffern aufzuaddieren. Allerdings würd mich dann doch interessieren, wie du die einzelnen Ziffern extrahierst.

Martin


----------



## Desertrose (23. Nov 2006)

bin jetzt jeden Druchlauf durchgegangen. Bei n=1234:
quersumme=4
n=123
quersumme=7
n=12
quersumme=9
n=1
quersumme=10
n=0

1234 hat als Quersumme 10

......... aber wieso 4,7,9 und dann 10? :bahnhof: 

Also mit dem Extrahieren hätte ich ganz normal "n=1234" einem String zu gewiesen und dann Entweder als String oder als CharArray ausgegeben. z.B:

String x=n+"";
Char []c=x.toChararray();

tmp=0;
for(int i=0;i<s.length();i++){

   tmp+=c_;
}
print(tmp);_


----------



## Murray (23. Nov 2006)

1. Durchlauf:
Der Rest der ganzzahligen Division von 1234 durch 10 ist 4, damit ist das Zwischenergebnis 4
1234 ganzzahling durch 10 geteilt ist 123

2. Durchlauf:
Der Rest der ganzzahligen Division von 123 durch 10 ist 3, damit ist das Zwischenergebnis 4 + 3 = 7
123 ganzzahling durch 10 geteilt ist 12

3. Durchlauf:
Der Rest der ganzzahligen Division von 12 durch 10 ist 2, damit ist das Zwischenergebnis  7 + 2 = 9
12 ganzzahling durch 10 geteilt ist 1

3. Durchlauf:
Der Rest der ganzzahligen Division von 1 durch 10 ist 1, damit ist das Zwischenergebnis 9 + 1 = 10
1 ganzzahling durch 10 geteilt ist 0, daher ist die Abbruchbedingung erfüllt.


Hast Du deinen Ansatz mal ausprobiert? Das wird so nicht funktionieren, weil das Zeichen '1' als int gecastet (und das passiert implizit, wenn man es als Summand bei einer Addition verwendet) eben nicht den Wert 1 hat.


----------



## Desertrose (23. Nov 2006)

achsooooo, jetzt sehe ich das!! Die n% 10, ist ja dazu du um einfach den Wert auf einzelne Ziffern zu splitten... Wäre dann falsch meine Methode zu nehmen? (Mit String und Char aufsplitten bzw. extrahieren)?


----------



## Murray (23. Nov 2006)

Desertrose hat gesagt.:
			
		

> Wäre dann falsch meine Methode zu nehmen? (Mit String und Char aufsplitten bzw. extrahieren)?


S.o. - so, wie du das hast, wird es nicht klappen, da die Zeichen als int gecastet die Wertigkeit ihres ASCII-Codes haben - zum Glück sind die im Code von '0' bis '9' aufsteigend angeordnet. Damit kann man also den Wert von '0' als Offset abziehen:


```
int i = '1'; //--- i ist jetzt 49
int j = '1' - '0'; //--- j ist jetzt 49-48 = 1
```


----------



## Desertrose (23. Nov 2006)

ooooooooooooops, sorry, natürlich, habe das nicht ausprobiert. Ich hatte wohl im Kopf das mit einem Array zu machen:


```
int [] a={1,2,3,4};
for(int i=0;.....)
tmp+=a[i].....
```
 
habe das nochmal abgetippt und verbessert, aber das haut hin:

```
int n = 1234;
		String a = n + "";
		int tmp = 0;
		int z;
		char c[] = a.toCharArray();
		String s = "";
		for (int i = 0; i < c.length; i++) {
			s = c[i] + "";
			z = Integer.parseInt(s);
			tmp += z;
		}

		System.out.println(tmp);
```


Aber bei dem Array habe ich gemerkt dass das nicht immer stimmer kann! Zum Beispiel wenn ich a[]={1,2,3,34,12}; eingebe, addiert es die ganze zahl 34... also Quatsch...oh jeee, gut dass ich das jetzt sehe , also ist das mit dem %10 doch der beste Weg. Als mein code da oben  :meld:


----------



## Murray (23. Nov 2006)

Wenn du es schon mit Strings löst, dann bleib dabei, mit den einzelnen Zeichen zu arbeiten; mach also nicht aus den Zeichen wieder ints, sondern rechne mit den Characters:


```
int n = 1234;
String a = n + "";
int tmp=0;
char c[] = a.toCharArray();
for (int i = 0; i < c.length; i++) {
  tmp += (c[i]-'0');
}
```

Das kann man noch etwas abkürzen (die neue Form der for-Schleife erfordert aber das JDK >= 1.5):

```
int n = 1234;
int tmp = 0;
for ( char c : (""+n).toCharArray() ) tmp += (c - '0');
```


----------



## Desertrose (24. Nov 2006)

stimmt, direkt dann in Charakters umwandeln ist natürlich besser. aber warum machst du :
tmp+=c_+'0' ; //wozu diese '0'?
nocmal ganz kurz zu meiner 2.Frage: Wenn in einer Aufgabe mit dezimalzahlen bzw.  natürlich Zahlen rechnen bzw einlesen, sind es doch einfach einzelene Ziffern von 0-9, also keine 10, 11, 38...?_


----------



## Murray (24. Nov 2006)

Desertrose hat gesagt.:
			
		

> tmp+=c_+'0' ; //wozu diese '0'?
> _


_
Ich dachte, das hätte ich oben erklärt? 

Es muss heissen


		Code:In die Zwischenablage kopieren


tmp+=(c[i]-'0')


Und zwar, weil ein Zeichen als int gecastet seinen ASCII-Code ergibt, also
'0' = 48
'1' = 49
'2' = 50
...
'9' = 57

Und dann sind also
'0'-'0' = 48 - 48 = 0
'1'-'0' = 49 - 48 = 1
'2'-'0' = 50 - 48 = 2
...
'9'-'0' = 57 - 48 = 9_


----------



## Murray (24. Nov 2006)

Desertrose hat gesagt.:
			
		

> nocmal ganz kurz zu meiner 2.Frage: Wenn in einer Aufgabe mit dezimalzahlen bzw.  natürlich Zahlen rechnen bzw einlesen, sind es doch einfach einzelne Ziffern von 0-9, also keine 10, 11, 38...?



Natürliche Zahlen sind positive ganze Zahlen (oder auch nicht-negative ganze Zahlen; die Definition ist nicht eindeutig - im ersten Fall ist die 0 nicht dabei, im zweiten schon). Auf jeden Fall sind 10, 11 ... auch natürliche Zahlen; es gibt unendlich viele.

Unter Dezimalzahlen versteht man normalerweise die numerische Darstellung einer Zahl im Dezimalsystem ( Zehnersystem), also in der Form, wie wir normalerweise mit Zahlen umgehen. Im Gegensatz dazu können Zahlen aber eben auch in anderen Zahlensystemen, z.B. im Binär- oder im Hexadezimalsyste, dargestellt werden. Dezimalzahlen sind aber weder notwendigerweise ganze noch natürliche Zahlen: -1 ist eine Dezimalzahl, aber keine natürliche Zahl (da negativ), 3.1415 ist auch eine Dezimalzahl, aber keine natürliche Zahl (da nicht ganz).

Ich habe aber auch schon gelesen, dass der Begriff Dezimalzahl verwendet wurde, wenn Zahlen mit einem Nachkommateil gemeint waren (also nicht-ganze Zahlen, unabhängig vom für die Darstellung verwendeten Zahlensystem); m.E. ist diese Verwendung  aber nicht korrekt.


----------

