# Palindrom



## Halt (27. Okt 2009)

Guten Abend,

wir sollen ein Palindrom erstellen, welches ganze Zahlen auswertet.
Wenn ich den Zahlenberreich einschränke ist es ja kein Problem. Aber ich würde gerne den ganzen Zahlenraum vom Integer auswerten, kann mir vllt. jemand einen Tipp geben.

Mit freundlichen Grüßen

Halt


----------



## hdi (27. Okt 2009)

Was meinst du mit auswerten? Ein Palindrom ist über dem Integerraum ist doch einfach sowas (wenn du nur positive Zahlen nimmst):

0123...Integer.MAX Integer.MAX...3210

oder was meinst du?


----------



## Halt (27. Okt 2009)

Um das Problem mal besser zu erklären wir dürfen kein String und keine Arrays verwenden.
Die einzigsten Befehle die wir verwenden können, sind die Befehle und Schleifen:
while, if/else, und das wars und damit muss ich den Wertebereich von -2.147.483.657
bis 2.157.583.648 abdecken.


----------



## hdi (27. Okt 2009)

edit: War'n Quatsch.

Vorschlag:



```
int i = Integer.MIN_VALUE;
while( i<= Integer.MAX_VALUE ){
     System.out.print(i++);
}
```

UNGETESTET! Ich weiss dass es Probs geben kann mit den Werten, also prüf das lieber


----------



## ice-breaker (27. Okt 2009)

Mit modulo-Operationen die einzelnen Ziffern zum prüfen rausholen


----------



## Schandro (27. Okt 2009)

wie wärs hiermit? könnte aber wahrscheinlich noch optimiert werden...

```
package dumb;

public class IntegerPalindromChecker {
	
	
	public static void main(String[] args) {
		for(int i=Integer.MIN_VALUE;i<=Integer.MAX_VALUE;++i){
			if(istPalindrom(i)){
				System.out.println(i);
			}
		}
	}
	
	public static boolean istPalindrom(int zahl){
		int length = (int) Math.log10(Math.abs(zahl));
		for(int i=0;i<=length/2;++i){
			if(getZiffer(zahl, i) != getZiffer(zahl, length-i)){
				return false;
			}
		}
		return true;
	}
	
	public static int getZiffer(int zahl, int index){
		int result = realModulo( (int)(zahl/Math.pow(10,index)) , 10 );
		//System.out.println("zahl="+zahl+" index="+index+"  result="+result);
		return result;		
	}
	
	public static int realModulo(int z1, int z2){
		return Math.abs(z1%z2);
	}
}
```
Achso: Bei Integer.MIN_VALUE ist die length 0. Warum? Weil Math.abs(Integer.MIN_VALUE) immer noch Integer.MIN_VALUE ist! Der Betrag von Integer.MIN_VALUE ist nämlich GRÖßER als Integer.MAX_VALUE. Deswegen liefert log10(Math.abs(Integer.MIN_VALUE)) 0 zurück. Aber egal, Integer.MIN_VALUE ist eh kein Polindrom. Wollts der Vollständigkeit halber nur erwähnt haben.


----------



## Landei (27. Okt 2009)

Schandro hat gesagt.:


> wie wärs hiermit? könnte aber wahrscheinlich noch optimiert werden...



Nicht nur wahrscheinlich 


```
public static boolean test(int n) {
        n = Math.abs(n);
        if (n % 10 == 0) {
            return n == 0;
        } else {
            int k = n;
            int r = 0;
            while (k > 0) {
                r = 10 * r + k % 10;
                k /= 10;
            }
            return n == r;
        }
    }
```


----------



## bygones (27. Okt 2009)

ah da freut sich das Aufgabe-loesungs-herz ;-)


----------

