002
28.05.2004, 14:27 Uhr
Oliver
S2-Pixelgeneral
|
Weiß nicht, ob ich das richtig verstanden habe, aber wie wärs damit (kann auch falsch sein):
C++: |
#include <iostream> #include <string> using namespace std;
#define max(z1,z2) ((z1>z2)?z1:z2) #define CharToInt(z) (z-48) #define IntToChar(z) (z+48) #define IsPalindrom(z) (z==Umkehren(z))
enum Vergleichsergebnis { VG_GROESSER, VG_KLEINER, VG_GLEICH };
// Strings addieren string StrAdd(string zahl1,string zahl2) { string ret; int i;
// Stellenzahl berechnen, damit Nullen aufgestocket werden können int stellenzahl=max(zahl1.length(),zahl2.length());
// Nullen aufstocken int diff; // im ersten String diff=stellenzahl-zahl1.length(); for(i=0;i<diff;++i) zahl1.insert(zahl1.begin(),'0'); // dasselbe in grün diff=stellenzahl-zahl2.length(); for(i=0;i<diff;++i) zahl2.insert(zahl2.begin(),'0');
// Schriftlich addieren int merke=0; int summand1,summand2; int summe;
for(i=stellenzahl-1;i>=0;--i) { summand1=CharToInt(zahl1[i]); summand2=CharToInt(zahl2[i]);
summe=summand1+summand2+merke;
if(summe>9) { ret.insert(ret.begin(),IntToChar(summe-10)); merke=1; } else { ret.insert(ret.begin(),IntToChar(summe)); merke=0; } } if(merke==1) ret.insert(ret.begin(),'1');
return ret;
}
// Vergleichen von Strings Vergleichsergebnis StrVergleiche(string zahl1,string zahl2) { // Stellenzahl berechnen, damit Nullen aufgestocket werden können int stellenzahl=max(zahl1.length(),zahl2.length());
// Nullen aufstocken int diff; // im ersten String diff=stellenzahl-zahl1.length();
int i; for(i=0;i<diff;++i) zahl1.insert(zahl1.begin(),'0'); // dasselbe in grün diff=stellenzahl-zahl2.length(); for(i=0;i<diff;++i) zahl2.insert(zahl2.begin(),'0');
for(i=0;i<stellenzahl;++i) { if(CharToInt(zahl1[i])>CharToInt(zahl2[i])) return VG_GROESSER; else if(CharToInt(zahl1[i])<CharToInt(zahl2[i])) return VG_KLEINER; }
return VG_GLEICH; }
string Umkehren(string zahl1) { string ret;
int length; length=zahl1.length();
for(int i=0;i<length;++i) { ret.insert(ret.begin(),zahl1[i]); }
return ret; }
int main() { // Grenze für Palindromzahlenalgorithmus // muss normalerweise nach Aufgabenstellung auf 2^64-1 stehen // lässt sich anpassen const string Grenze="10000000"; // Kleinste Zahl finden die, nicht mit dem Algorithmus brechnet werden kann string zahl="1"; string umkehrung; string temp; while(1) { temp=zahl; while(!IsPalindrom(temp)) { if(StrVergleiche(temp,Grenze)==VG_GROESSER) { cout << "Die kleinste Zahl ist gefunden, sie heisst: " << zahl; goto raus; } // Zahl für Umkehrung umkehrung=Umkehren(temp); // Sich selbst und Umkehrung addieren temp=StrAdd(temp,umkehrung); } // Nächste Zahl prüfen zahl=StrAdd(zahl,"1"); }
raus:
cin.get(); return 0; }
|
-- Demokratie ist die Diktatur der Mehrheit.
www.siedler25.org/ ( Siedler2 - Remake ) |