সমস্যা
একটি রেঞ্জ (নিম্ন ও উচhibang) এবং একটি সংখ্যা দেওয়া আছে। সেই রেঞ্জের মধ্যে কতগুলো সংখ্যা দেওয়া সংখ্যা দিয়ে বিভাজ্য, সেটি গণনা করতে হবে।
উদাহরণ কোড
const range = [6, 57];
const num = 3;
const findDivisibleCount = (num = 1, [l, h]) => {
let count = 0;
for (let i = l; i <= h; i++) {
if (i % num === 0) {
count++;
}
}
return count;
};
console.log(findDivisibleCount(num, range));
আউটপুট
18
ব্যাখ্যা
- রেঞ্জ: ৬ থেকে ৫৭ (ইনক্লুসিভ)
- ৩ দিয়ে বিভাজ্য সংখ্যাগুলো: ৬, ৯, ১২, ১৫, ১৮, ২১, ২৪, ২৭, ৩০, ৩৩, ৩৬, ৩৯, ৪২, ৪৫, ৪৮, ৫১, ৫৪, ৫৭ → মোট ১৮টি
- ডিস্ট্রাকচারিং
[l, h]দিয়ে রেঞ্জ বের করা হয়েছে।
অপ্টিমাইজড সমাধান (O(1) - লুপ ছাড়া)
গাণিতিক সূত্র ব্যবহার করে সরাসরি গণনা করা যায়:
const findDivisibleCountOptimized = (num, [l, h]) => {
if (num === 0) return 0; // বিভাজন বাই জিরো এড়ান
const first = Math.ceil(l / num) * num; // রেঞ্জের প্রথম মাল্টিপ্ল
if (first > h) return 0; // রেঞ্জে কোনো মাল্টিপ্ল নেই
const last = Math.floor(h / num) * num; // রেঞ্জের শেষ মাল্টিপ্ল
return (last - first) / num + 1;
};
console.log(findDivisibleCountOptimized(3, [6, 57])); // 18
console.log(findDivisibleCountOptimized(7, [1, 10])); // 1 (সिर्फ 7)
console.log(findDivisibleCountOptimized(5, [11, 14])); // 0
সূত্র ব্যাখ্যা
- প্রথম মাল্টিপ্ল:
ceil(l/num) * num - শেষ মাল্টিপ্ল:
floor(h/num) * num - সংখ্যা:
(last - first) / num + 1(arithmetic progression)
বেনচমার্ক
বড় রেঞ্জের জন্য (যেমন ১ থেকে ১ বিলিয়ন) লুপ ভিত্তিক সমাধান খুব ধীর, গাণিতিক সমাধান миক্রোসেকেন্ডে কাজ করে।