Zahlenpalindrom
-
Angelehnt an einen anderen Thread wollte ich hier nochmal eine alte Aufgabe bearbeiten. Und zwar geht es darum Zahlenpalindrome zu finden. Vorweg möchte ich noch kurz anmerken, dass man sicher anders an die Sache herangehen könnte, aber so, wie ich mir das gedacht habe, wollte ich das auch beibehalten. Schließlich führen ja bekanntlich viele Wege nach Rom
Hier nun also erstmal der Code
#include <stdio.h> #include <stdlib.h> #include <math.h> int stellen(double); int main() { int i,j,n,m, palindrom = 0; double produkt, produkt_var; double* array; for(i = 100; i <= 999; i++) { for(j = 100; j <= 999; j++) { produkt = i*j; produkt_var = produkt; n = stellen(produkt); array = (double*) calloc(n, sizeof(double)); //Das Produkt ziffernweise in ein Feld übertragen for(m = 0; m <n; m++) { array[m] = produkt / pow(10, n-1-m); produkt = produkt - array[m] * pow(10, n-1-m); } /*printf("%d * %d = ",i,j); for(m = 0; m < n; m++) { printf("%d",array[m]); } printf("\n\n"); */ for(m = 0; m < n; m++) { if(array[m] == array[n-1-m]) { palindrom = 1; } else { palindrom = 0; } } if(palindrom == 1) { printf("%f ist ein Palidrom\n", produkt_var); } /*else { printf("%ld ist kein Palidrom\n", produkt_var); }*/ free(array); } } return 0; } int stellen(double zahl) { int count = 0; double basis = 10.0; do { ++count; }while(zahl/=basis); return count; }
Kann mir bitte jemand erklären, warum offensichtlich nur das erste und das letzte Element in "array[]" überprüft werden und er dann scheinbar aus der for-Schleife ausbricht? Ich seh das Problem gerade nicht
-
Hallo!
z.B. diese Zeile
array = (double*) calloc(n, sizeof(double));
innerhalb einer zweifach verschachtelten for-Schleife, schickt Dein Programm mit Sicherheit in die "ewigen Jagdgründe".
Es geht doch einfacher, man kann ermitteln wieviel Stellen es maximal sein können, bei unsigned int z.B. sind es maximal 10 dezimale Stellen.
Ansonsten, wie Du schon sagtest "Viele Wege führen nach Rom!"Palindromausgabe z.B. so:
#include <stdio.h> #define BASIS 10 int stellen(unsigned); int main() { int n,m, palindrom = 0, nr = 0; unsigned zahl, tmp; unsigned array[10]; for(zahl = 11; zahl < 10000011 ; zahl++) { tmp = zahl; n = stellen(tmp); m = n; //Die Zahl ziffernweise in ein Feld übertragen for(; m; m--) { array[m-1] = tmp%BASIS; tmp /= BASIS; } for(m = 0; m < n; m++) { palindrom = 1; if(array[m] == array[n-1-m]) { continue; } else { palindrom = 0; break; } } if(palindrom == 1) { nr++; printf("Palindrom Nr. %d %u \n", nr, zahl); } } return 0; } int stellen(unsigned zahl) { int count = 0; do { count++; } while(zahl/=BASIS); return count; }
MfG
MfG
-
freak11 schrieb:
Hallo!
z.B. diese Zeile
array = (double*) calloc(n, sizeof(double));
innerhalb einer zweifach verschachtelten for-Schleife, schickt Dein Programm mit Sicherheit in die "ewigen Jagdgründe".
Wieso sollte sich das Programm dort verrennen? Nach jedem einzelnen Schleifendurchlauf wird der allozierte Speicher wieder frei gegeben. Ich hätte höchstens nochmal eine Abfrage einbauen können, ob beim allozieren und freigeben alles glatt gelaufen ist, aber sonst geht das doch
Die Vermutung lag also nahe, dass er hier
for(m = 0; m < n; m++) { if(array[m] == array[n-1-m]) { palindrom = 1; } else { palindrom = 0; } }
nicht wie erwartet arbeitet. Ist ja auch irgendwie klar, weil z.B. Zahlen mit ungeraden stellen spätestens in der Mitte wieder gleich sind
Ich hätte also nach der ersten Abweichung abbrechen müssen.
-
Die Funktion
stellen()
ist total kaputt. Sowas kann nicht gehen...
-
Tim schrieb:
Die Funktion
stellen()
ist total kaputt. Sowas kann nicht gehen...DAS musst du mir jetzt aber mal ganz ausführlich erklären, denn sie funktioniert ganz prima
-
#include <stdio.h> int stellen(double zahl) { int count = 0; double basis = 10.0; do { ++count; }while(zahl/=basis); return count; } int main(void) { printf("%d\n", stellen(1.0)); return 0; }
"Ganz prima"
-
Tim schrieb:
#include <stdio.h> int stellen(double zahl) { int count = 0; double basis = 10.0; do { ++count; }while(zahl/=basis); return count; } int main(void) { printf("%d\n", stellen(1.0)); return 0; }
"Ganz prima"
Die Variante mit double war eh hinfällig. Am Anfang und am Ende lief es immer mit "int" und von daher klappt es in dem Fall perfekt :p
-
Ich habe vor ein Paar Tagen das gleiche Programm geschrieben. Falls dich eine andere Lösung interessiert:
#include <stdlib.h> #include <string.h> void isPali(int num,int *pali){ int i=0; int len; int erg=1; char werte[10]; itoa(num,werte,10); len=strlen(werte); for(i=0;i<len/2;i++){ if(werte[i]!=werte[len-i-1]){ erg=0; break; } } if(erg==1){ *pali=num; } return; } int main(void){ int i,j; int pali=0; int max=0; for(i=100;i<=999;i++){ for(j=100;j<=999;j++){ isPali(i*j,&pali); if(pali>max){ max=pali; } } } printf("max: %d",max); system("PAUSE"); return 0; }