Eine andere Möglichkeit wäre die folgende:
Sie beginnen mit der größten Dezimalzahl des Typs "1111111 ... 1111", die vom verwendeten Datentyp unterstützt wird
Der Algorithmus geht davon aus, dass die Eingabe kleiner als diese Zahl ist. Andernfalls müssen Sie einen anderen Datentyp verwenden.
Beispiel: Bei der Verwendung long long
beginnen Sie mit der Nummer 1111111111111111111
.
- Verarbeiten Sie dann jede Dezimalstelle von links nach rechts:
- Versuchen Sie, die Ziffer von 1 auf 0 zu ändern.
- Wenn das Ergebnis immer noch größer als Ihre Eingabe ist, nehmen Sie die Änderung vor (ändern Sie die Ziffer auf 0).
- Ansonsten bleibt die Ziffer 1.
Beispiel
Input = 10103
Start: 111111
Step 1: [1]11111, try [0]11111; 011111 > 10103 => 011111
Step 2: 0[1]1111, try 0[0]1111; 001111 < 10103 => 011111
Step 3: 01[1]111, try 01[0]111; 010111 > 10103 => 010111
Step 4: 010[1]11, try 010[0]11; 010011 < 10103 => 010111
Step 5: 0101[1]1, try 0101[0]1; 010101 < 10103 => 010111
Step 6: 01011[1], try 01011[0]; 010110 > 10103 => 010110
Result: 010110
Korrektheitsnachweis:
Wir verarbeiten in diesem Algorithmus Ziffer für Ziffer. In jedem Schritt gibt es Ziffern, deren Wert bereits bekannt ist, und Ziffern, deren Werte noch nicht bekannt sind.
In jedem Schritt prüfen wir die am weitesten links stehende unbekannte Ziffer.
Wir setzen diese Ziffer auf "0" und alle anderen unbekannten Ziffern auf "1". Da die zu prüfende Ziffer die höchstwertige der unbekannten Ziffern ist, ist die resultierende Zahl die größtmögliche Zahl, wobei diese Ziffer eine "0" ist. Wenn diese Zahl kleiner oder gleich der Eingabe ist, muss die zu prüfende Ziffer eine "1" sein.
Andererseits ist die resultierende Zahl kleiner als alle möglichen Zahlen, bei denen die zu prüfende Ziffer eine "1" ist. Wenn die resultierende Zahl größer als die Eingabe ist, muss die Ziffer "0" sein.
Dies bedeutet, dass wir in jedem Schritt eine Ziffer berechnen können.
C-Code
(Der C-Code sollte auch unter C ++ funktionieren):
long long input;
long long result;
long long digit;
... read in input ...
result = 1111111111111111111ll;
digit = 1000000000000000000ll;
while( digit > 0 )
{
if(result - digit > input)
{
result -= digit;
}
digit /= 10;
}
... print out output ...