কম্পিউটার টিউটোরিয়াল

জাভাস্ক্রিপ্টে রেঞ্জের মধ্যে নির্দিষ্ট সংখ্যা দিয়ে বিভাজ্য সংখ্যার গণনা

সমস্যা

একটি রেঞ্জ (নিম্ন ও উচ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)

বেনচমার্ক

বড় রেঞ্জের জন্য (যেমন ১ থেকে ১ বিলিয়ন) লুপ ভিত্তিক সমাধান খুব ধীর, গাণিতিক সমাধান миক্রোসেকেন্ডে কাজ করে।

  1. জাভাস্ক্রিপ্টে নির্দিষ্ট দূরত্বের k-প্রাইম নম্বর জোড়া খুঁজে বের করা

  2. জাভাস্ক্রিপ্টে রেঞ্জে প্রাইম নম্বর যাদের ডিজিট স্কয়ার সাম ১ হয়

  3. জাভাস্ক্রিপ্টে রেঞ্জে আপসাইড ডাউন নম্বর (১৮০° ঘোরালে একই) গণনা

  4. সি++-এ দিয়ে রেঞ্জে M দ্বারা বিভাজ্য সংখ্যা গণনা