আমাদের একটি সংখ্যা N এবং আরেকটি সংখ্যা L দেওয়া হয়েছে। লক্ষ্য হল 1 এবং N এর মধ্যে এমন সংখ্যাগুলি খুঁজে বের করা যেগুলির সংখ্যার মধ্যে পার্থক্য রয়েছে এবং এর অঙ্কগুলির যোগফল L-এর চেয়ে কম নয়৷
যদি N=23, L=10 তাহলে এই ধরনের সংখ্যার গণনা হবে 4।
23-(2+3)=18, 22-(2+2)=18, 21-(2+1)=18, 20-(2+0)=18।
উপরের সমস্ত সংখ্যা শর্ত পূরণ করে
কিন্তু 19-(1+9)=9 যা L থেকে কম, একইভাবে 18,17….1.
আসুন উদাহরণ দিয়ে বুঝতে পারি
ইনপুট − N=30 L=19
আউটপুট − সংখ্যার গণনা যেমন সংখ্যা এবং এর সংখ্যার যোগফলের মধ্যে পার্থক্য L-এর চেয়ে কম নয় − 1
ব্যাখ্যা − শুধুমাত্র 30 শর্ত পূরণ করে, 30-(3+0)=27> 19
ইনপুট − N=123330 L=5466
আউটপুট − সংখ্যার গণনা যেমন সংখ্যা এবং এর সংখ্যার যোগফলের মধ্যে পার্থক্য L এর কম নয় − 6841
নিম্নলিখিত প্রোগ্রামে ব্যবহৃত পদ্ধতি
বাইনারি অনুসন্ধান ব্যবহার করে আমরা শর্ত পূরণকারী প্রথম সংখ্যাটি খুঁজে পাব। যদি সংখ্যাটি সংখ্যা হয় তবে শর্তটি num+1 এর জন্যও সত্য হবে।
যদি কোনো বর্তমান মধ্য মান শর্তটি সন্তুষ্ট করে তবে মধ্য এবং শেষের মধ্যে সমস্ত সংখ্যাও এই শর্তটি পূরণ করবে যাতে আমরা গণনা করার জন্য কেবলমাত্র শেষ-মধ্য +1 যোগ করতে পারি।
-
লং ভেরিয়েবল হিসাবে num এবং L নিন।
-
ফাংশন Digit_sum(LL num) একটি সংখ্যা সংখ্যা নেয় এবং এর সংখ্যার যোগফল প্রদান করে।
-
মোট =0 হিসাবে প্রাথমিক যোগফল নিন।
-
একটি সময় লুপ ব্যবহার করে, মোটে অনুস্মারক সংখ্যা %10 যোগ করুন এবং সংখ্যা 10 দ্বারা কমিয়ে দিন৷ সংখ্যা>0 পর্যন্ত এটি করুন৷
-
সংখ্যার অঙ্কের যোগফল হিসাবে মোট রিটার্ন করুন।
-
ফাংশন Less_than_L(LL num, LL L) একটি সংখ্যা num এবং একটি সংখ্যা L নেয় এবং সংখ্যার গণনা প্রদান করে যাতে সংখ্যার সংখ্যা এবং যোগফলের মধ্যে পার্থক্য L-এর চেয়ে কম নয়।
-
0 হিসাবে প্রাথমিক গণনা নিন।
-
যখন লুপ যেখানে start=1 এবং end=num.
ব্যবহার করে বাইনারি অনুসন্ধান প্রয়োগ করুন -
temp=(start+end)/2 হিসাবে মধ্যম সংখ্যা গণনা করুন।
-
যদি temp এবং temp-এর অঙ্কের যোগফলের মধ্যে পার্থক্য L-এর কম না হয় তবে temp-এর চেয়ে বড় সমস্ত সংখ্যাও একই শর্ত পূরণ করবে।
-
টেম্প সহ এই ধরনের সংখ্যার সংখ্যা হবে num-temp+1। গণনা করতে এই যোগ করুন. এবং end=temp-1 সেট করুন।
-
অন্যথায় start=temp+1.
সেট করুন -
বাইনারি অনুসন্ধান গণনার শেষে তাদের মধ্যে পার্থক্য সহ সংখ্যা থাকবে এবং সংখ্যার যোগফল L
এর চেয়ে কম নয় -
ফলাফল হিসাবে রিটার্ন গণনা।
উদাহরণ
#include <bits/stdc++.h> using namespace std; typedef long long LL; int Digit_sum(LL num){ LL total = 0; while (num > 0){ total += num % 10; num = num/10; z} return total; } LL Less_than_L(LL num, LL L){ LL count = 0; LL start = 1; LL end = num; while (start <= end){ LL temp = (end + start) / 2; LL temp_2 = temp - Digit_sum(temp); if (temp_2 >= L){ count = num - temp + 1; end = temp - 1; } else{ start = temp + 1; } } return count; } int main(){ LL num = 234516; LL L = 235; cout<<"Count of Numbers such that difference between the number and sum of its digits not less than L are: "<< Less_than_L(num, L); return 0; }
আউটপুট
যদি আমরা উপরের কোডটি চালাই তবে এটি নিম্নলিখিত আউটপুট −
উৎপন্ন করবেCount of Numbers such that difference between the number and sum of its digits not less than L are: 234267