আর একটি সম্ভাবনা নিম্নলিখিতটি হতে পারে:
আপনি "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" হবে।
এর অর্থ হ'ল আমরা প্রতিটি ধাপে একটি অঙ্ক গণনা করতে পারি।
সি কোড
(সি কোডটিও সি ++ এর অধীনে কাজ করা উচিত):
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 ...