একটি পূর্ণসংখ্যার রেঞ্জ দেওয়া আছে এবং ঐ রেঞ্জে বিশেষ সংখ্যাগুলো বের করতে বলা হয়েছে। একটি বিশেষ সংখ্যা হল একটি ধনাত্মক পূর্ণসংখ্যা যার দশমিক রিপ্রেজেন্টেশনে শুধু ১ অঙ্ক থাকে। ১ এর বেশি অঙ্ক থাকলেও সংখ্যাটি বিশেষ হতে পারে যদি সংখ্যাটি তার অঙ্কের সংখ্যা দিয়ে বিভাজ্য হয় এবং ভাগফলটি নিজে একটি বিশেষ সংখ্যা হয়। দেওয়া রেঞ্জ (left_limit, right_limit)-এ কতগুলো বিশেষ সংখ্যা আছে তা রিটার্ন করতে হবে।
ইনপুট left_limit = 5, right_limit = 30 হলে আউটপুট হবে 13।
এই রেঞ্জের বিশেষ সংখ্যাগুলো: 5, 6, 7, 8, 9, 10, 12, 14, 16, 18, 20, 24, 28।
সমাধানের ধাপসমূহ
- যদি right_limit < 10 হয়, তবে right_limit - left_limit + 1 ফেরত দিন
- len_right := str(right_limit)-এর দৈর্ঘ্য
- number_list := [0,1,2,3,4,5,6,7,8,9,10,12,14,16,18]
- j = 2 থেকে len_right + 1 পর্যন্ত:
- number_list-এর প্রতিটি k-এর জন্য:
- temp1 := k × j
- যদি str(temp1)-এর দৈর্ঘ্য == j হয়, তবে number_list-এ temp1 যোগ করুন
- অন্যথায় যদি len(str(temp1)) > j হয়, তবে লুপ থেকে বের হোন
- যদি number_list[-1] >= right_limit হয়, তবে লুপ থেকে বের হোন
- number_list-এর প্রতিটি k-এর জন্য:
- number_list থেকে ডুপ্লিকেট মুছে সর্ট করুন
- count := 0
- number_list-এর প্রতিটি temp2-এর জন্য:
- যদি temp2 >= left_limit এবং temp2 <= right_limit হয়, তবে count := count + 1
- count ফেরত দিন
উদাহরণ
def strange(left_limit, right_limit):
if right_limit < 10:
return right_limit - left_limit + 1
len_right = len(str(right_limit))
number_list = [0,1,2,3,4,5,6,7,8,9,10,12,14,16,18]
for j in range(2, len_right + 1):
for k in number_list:
temp1 = k * j
if len(str(temp1)) == j:
number_list.append(temp1)
elif len(str(temp1)) > j:
break
if number_list[len(number_list)-1] >= right_limit:
break
number_list = list(set(number_list))
count = 0
for temp2 in number_list:
if temp2 >= left_limit and temp2 <= right_limit:
count = count + 1
return count
print(strange(5, 30))
ইনপুট
5, 30
আউটপুট
13