Başka bir olasılık şu olabilir:
Kullanılan veri türü tarafından desteklenen en büyük ondalık sayı olan "1111111 ... 1111" ile başlıyorsunuz
Algoritma, girdinin bu sayıdan daha küçük olduğunu varsayar; aksi takdirde başka bir veri türü kullanmanız gerekir.
Örnek: Kullanırken long longnumarayla başlarsınız 1111111111111111111.
- Ardından her ondalık basamağı soldan sağa doğru işleyin:
- Rakamı 1'den 0'a değiştirmeyi deneyin.
- Sonuç hala girişinizden daha büyükse değişikliği yapın (rakamı 0 olarak değiştirin).
- Aksi takdirde rakam 1 olarak kalır.
Misal
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
Doğruluk kanıtı:
Bu algoritmada basamak basamak işliyoruz. Her adımda, değeri zaten bilinen rakamlar ve henüz değerleri bilinmeyen rakamlar vardır.
Her adımda, en soldaki bilinmeyen basamağı araştırıyoruz.
Bu rakamı "0" ve diğer tüm bilinmeyen rakamları "1" olarak ayarladık. Problanacak basamak bilinmeyen basamakların en önemlisi olduğundan, elde edilen sayı mümkün olan en büyük sayıdır ve bu rakam "0" dır. Bu sayı girişten daha az veya eşitse, incelenen basamak bir "1" olmalıdır.
Öte yandan, elde edilen sayı, incelenen rakamın "1" olduğu tüm olası rakamlardan daha küçüktür. Ortaya çıkan sayı girişten büyükse, rakam "0" olmalıdır.
Bu, her adımda bir basamak hesaplayabileceğimiz anlamına gelir.
C kodu
(C kodu C ++ altında da çalışmalıdır):
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 ...