Kemungkinan lain adalah yang berikut:
Anda mulai dengan angka desimal terbesar dari tipe "1111111 ... 1111" yang didukung oleh tipe data yang digunakan
Algoritme mengasumsikan bahwa input lebih kecil dari angka ini; jika tidak, Anda harus menggunakan tipe data lain.
Contoh: Saat menggunakan long long
, Anda mulai dengan nomornya 1111111111111111111
.
- Kemudian proses setiap angka desimal dari kiri ke kanan:
- Cobalah untuk mengubah digit dari 1 ke 0.
- Jika hasilnya masih lebih besar dari input Anda, lakukan perubahan (ubah digit menjadi 0).
- Kalau tidak digitnya tetap 1.
Contoh
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
Bukti kebenaran:
Kami memproses digit demi digit dalam algoritma ini. Di setiap langkah, ada digit yang nilainya sudah diketahui dan digit yang nilainya belum diketahui.
Di setiap langkah, kami menyelidiki digit paling tidak dikenal yang paling kiri.
Kami menetapkan digit itu ke "0" dan semua digit tidak dikenal lainnya menjadi "1". Karena digit yang akan diselidiki adalah yang paling signifikan dari digit yang tidak diketahui, angka yang dihasilkan adalah angka terbesar yang mungkin dengan digit itu menjadi "0". Jika angka ini kurang atau sama dengan input, digit yang diperiksa harus berupa "1".
Di sisi lain, angka yang dihasilkan lebih kecil dari semua angka yang mungkin di mana angka yang diselidiki adalah "1". Jika angka yang dihasilkan lebih besar dari input, digit harus "0".
Ini berarti bahwa kita dapat menghitung satu digit di setiap langkah.
Kode C
(Kode C juga harus bekerja di bawah C ++):
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 ...