एक और संभावना निम्नलिखित होगी:
आप उपयोग किए गए डेटा प्रकार द्वारा समर्थित "1111111 ... 1111" प्रकार की सबसे बड़ी दशमलव संख्या से शुरू करते हैं
एल्गोरिथ्म मानता है कि इनपुट इस संख्या से छोटा है; अन्यथा आपको दूसरे डेटा प्रकार का उपयोग करना होगा।
उदाहरण: उपयोग करते समय long long, आप संख्या के साथ शुरू करते हैं 1111111111111111111।
- फिर बाएं से दाएं प्रत्येक दशमलव अंक को संसाधित करें:
- अंक को 1 से 0 तक बदलने का प्रयास करें।
- यदि परिणाम आपके इनपुट से अभी भी बड़ा है, तो परिवर्तन करें (अंक को 0 पर बदलें)।
- अन्यथा अंक 1 रहता है।
उदाहरण
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
शुद्धता का प्रमाण:
हम इस एल्गोरिथ्म में अंकों द्वारा अंकों की प्रक्रिया करते हैं। प्रत्येक चरण में, ऐसे अंक होते हैं जिनका मूल्य पहले से ज्ञात होता है और ऐसे अंक जिनके मान ज्ञात नहीं हैं, फिर भी।
प्रत्येक चरण में, हम बाईं ओर के अज्ञात अंक की जांच करते हैं।
हम उस अंक को "0" और अन्य सभी अज्ञात अंकों को "1" पर सेट करते हैं। क्योंकि अंको की जांच की जाने वाली संख्या अज्ञात अंकों की सबसे महत्वपूर्ण होती है, जिसके परिणामस्वरूप संख्या उस अंक का सबसे बड़ा संभव अंक होता है जिसमें "0" होता है। यदि यह संख्या इनपुट से कम या बराबर है, तो जांच की जा रही अंक "1" होना चाहिए।
दूसरी ओर, परिणामी संख्या सभी संभावित संख्याओं की तुलना में छोटी होती है जहां अंक की जांच की जा रही है "1"। यदि परिणामी संख्या इनपुट से बड़ी है, तो अंक "0" होना चाहिए।
इसका मतलब है कि हम प्रत्येक चरण में एक अंक की गणना कर सकते हैं।
सी कोड
(C कोड 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 ...