# Palindromzahlen



## Eviie (22. November 2010)

Heyihr super Programmierer da draußen, 


ich hab ein kleines Problemchen...
Ich habe keine Ahnung vom Programmieren und muss morgen eine Aufgabe vorstellen.

(Entdecken Sie Palindrome, in dieser Aufgabe beschränkt auf Zahlen, die vorwärts und rückwärts gelesen jeweils die gleiche Zahl ergeben.
SChreiben Sie die Funktion bool isPalindrome (int) die TRUE bzw. FALSE als Rückgabewert liefert, je nachdem, ob die eingegebene Zahl ein Palindrom ist oder nicht.

Betten Sie die Implementierung in folgende DAtei ein.

- my_Palindrome.h  ; Hier wird der Prototyp bool isPAlindrome(int) stehen
- my_palindrome.cpp ; Hier geben Sie dir Implementierung an.

Integer ZAhlen sollen vom BEnutzer eingelesen werden und auf Palindrome überprüft werde.Das Ergebins soll auf den Bildschirm ausgegeben werden.
Der Benutzer soll nach einer Palindromberechnung gefragt werden, ob er einen weiteren Programmdurchlauf wünscht oder nicht.
DUrch EIngabe von c wird das PRg beendet, in allen anderen Fällen startet das PRogramm erneut..




Es wäre echt cool von euch da draußen, wenn ihr helfen könntet...


Merciii im vorraus


----------



## Tim Bureck (22. November 2010)

Sorry, aber wir werden dir hier nicht deine Hausaufgaben machen. Das ist nicht Sinn der Sache. Probier es selbst (irgendwas musst du doch schon können, sonst würdest du doch nicht so eine Aufgabe in so kurzer Zeit bekommen?) und wenn du Probleme hast, poste deinen Code hier und wir können dich unterstützen.


----------



## Bratkartoffel (22. November 2010)

Hi,

ich denke dein Post wäre hier besser aufgehoben, wenn du es wirklich komplett von anderen machen lassen willst. Ob es dir aber jemand macht, ist die andere Frage.

Ansonsten schließe ich mich Tim Bureck an, versuche es doch zumindest selbst. Ganz blank im Programmieren kannst du ja nicht sein, was hätte dann diese Aufgabe für einen Sinn? 

// Edit: Willst du das Ganze eigentlich in C(99) oder C++ machen?

// Edit 2: Wollte eh mal wieder was in C machen, hier mal meine Lösung. Ist in C99, musst also eventuell auf C++ umschreiben. Kannst quasi als Ansatz sehen, wie man es machen kann. Findet man übrigens auch größtenteils so via google. Habs getestet, aber eventuell gehts auch besser:

*my_palindrome.c*:

```
/*
 * Implementierung der my_palindrome
*/
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>

#include "my_palindrome.h"

bool isPalindrome(int zahl) {
  char* str1 = (char*) malloc(sizeof(const char*) * 24);
  *str1 = '\0';
  char* str2 = (char*) malloc(sizeof(const char*) * 24);
  *str2 = '\0';

  snprintf(str1, 24, "%u", zahl);
  
  size_t len = strlen(str1);
  int akt;

  for(akt = len-1; akt >= 0; akt--)
    str2[(len-1) - akt] = str1[akt];

  str1[len] = '\0';
  str2[len] = '\0';

  bool result = (strcmp(str1, str2) == 0); 
  free(str1);
  free(str2);
  return result;
}

int main(void) {
  int zahl;
  char abbrechen;
  char line[100];

  do {
    abbrechen = 0;
    zahl = 0;

    printf("Bitte eine Zahl eingeben: ");
    fflush(stdin);
    fgets(line, sizeof(line), stdin);
    int tmp = sscanf(line, "%i", &zahl);

    if(tmp == 0 || tmp == EOF || zahl < 0) {
      printf("Keine gültige Zahl eingegeben.\n");
    } else {
      if(isPalindrome(zahl)) {
        printf("Die angegebene Zahl ist ein Palindrom.\n");
      } else {
        printf("Die angegebene Zahl ist *kein* Palindrom.\n");
      }
    }

    printf("Wollen Sie noch eine Zahl prüfen? (Abbruch mit 'c'): ");
    fflush(stdin);
    fgets(line, sizeof(line), stdin);
    sscanf(line, "%c", &abbrechen);
  } while (abbrechen != 'c');

  return 0;
}
```

*my_palindrome.h*:

```
/*
 * Header für my_palindrome
*/

#include <stdbool.h> 
  
bool isPalindrome(int);
```

*Kompilierung und Aufruf / Testausgabe:*

```
$> gcc -Wall -Wextra -ansi -std=c99 -o palindrome -g my_palindrome.c
$> ./palindrome
Bitte eine Zahl eingeben: 1234
Die angegebene Zahl ist *kein* Palindrom.
Wollen Sie noch eine Zahl prüfen? (Abbruch mit 'c'):  
Bitte eine Zahl eingeben: 12321
Die angegebene Zahl ist ein Palindrom.
Wollen Sie noch eine Zahl prüfen? (Abbruch mit 'c'): asd
Bitte eine Zahl eingeben: 123434321
Die angegebene Zahl ist ein Palindrom.
Wollen Sie noch eine Zahl prüfen? (Abbruch mit 'c'): c
```

*valgrind Ausgabe (gekürzt, Speicher passt alles):*

```
==12216== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 13 from 1)
--12216-- 
==12216== malloc/free: in use at exit: 0 bytes in 0 blocks.
==12216== malloc/free: 6 allocs, 6 frees, 576 bytes allocated.
==12216== 
==12216== All heap blocks were freed -- no leaks are possible.
```

Gruß
BK


----------



## deepthroat (23. November 2010)

Hi.

Die Version von Bratkartoffel ist eine recht naive, verschwenderische Variante.

1. man muss eine Zahl nicht in einen String umwandeln um zu prüfen ob die Zahl ein Palindrom ist.

2. selbst wenn man die Zahl in einen String umwandelt muss man den String nicht umdrehen und vergleichen, man kann einfach prüfen ob str[i] == str[n - i] für 0<= i <= n div 2 (n ~= strlen).

\edit: zu 1.) Vorgehensweise:

- ermittle die größte Zehnerpotenz z für die gilt: zahl / z > 0
- prüfe ob für jede Stelle 
	
	
	



```
zahl[i] == zahl[log10(z) - i]
```
 gilt für 0<= i <= log10(z) div 2

Gruß


----------



## Matthias Reitinger (23. November 2010)

deepthroat hat gesagt.:


> \edit: zu 1.) Vorgehensweise:
> 
> - ermittle die größte Zehnerpotenz z für die gilt: zahl / z > 0
> - prüfe ob für jede Stelle
> ...


Noch eine Alternative, bei der man keine Logarithmen braucht:

```
bool isPalindrome(int x) {
  if (x < 0) return false; // Je nach Definition...

  int tmp = x;
  int xi = 0;
  while (tmp != 0) {
    xi = xi*10 + tmp%10;
    tmp /= 10;
  }

  return xi == x;
}
```

Grüße,
Matthias


----------



## deepthroat (23. November 2010)

Matthias Reitinger hat gesagt.:


> Noch eine Alternative, bei der man keine Logarithmen braucht:


Der Logarithmus war nur durch die Notation notwendig geworden. Bei der Implementierung muss nicht mit Logarithmus gearbeitet werden.

Gruß


----------



## Matthias Reitinger (23. November 2010)

deepthroat hat gesagt.:


> Der Logarithmus war nur durch die Notation notwendig geworden. Bei der Implementierung muss nicht mit Logarithmus gearbeitet werden.


Stimmt natürlich. Wie würde dann eine Implementierung deiner Idee aussehen? Den „wahlfreien“ Zugriff auf die Ziffern würdest du dann auch über Division (durch Zehnerpotenz) und Modulo 10 erreichen, richtig?

Grüße,
Matthias


----------



## deepthroat (24. November 2010)

Hi.





Matthias Reitinger hat gesagt.:


> Stimmt natürlich. Wie würde dann eine Implementierung deiner Idee aussehen? Den „wahlfreien“ Zugriff auf die Ziffern würdest du dann auch über Division (durch Zehnerpotenz) und Modulo 10 erreichen, richtig?


Ja, genau. Das ist natürlich eine Menge Rechnerei, da ist deine Lösung eleganter.

Gruß


----------

