ধরুন আমাদের একটি সংখ্যা n আছে, আমাদের পরীক্ষা করতে হবে n কে দুটি সেমি-প্রাইমের যোগফল হিসেবে প্রকাশ করা যায় কি না।
আমরা জানি সেমি-প্রাইম একটি সংখ্যা যদি এটি দুটি মৌলিক সংখ্যার গুণফল হিসাবে প্রকাশ করা যায়। প্রথম কয়েকটি সেমি-প্রাইম সংখ্যা হল (1 - 100 পরিসর):4, 6, 9, 10, 14, 15, 21, 22, 25, 26, 33, 34, 35, 38, 39, 46, 49, 51, 55, 57, 58, 62, 65, 69, 74, 77, 82, 85, 86, 87, 91, 93, 94, 95।
সুতরাং, যদি ইনপুটটি n =108 এর মত হয়, তাহলে আউটপুটটি True হবে কারণ এটি 14 এবং 94 এর যোগফল উভয়ই সেমি-প্রাইম।
এটি সমাধান করতে, আমরা এই পদক্ষেপগুলি অনুসরণ করব -
- MAX :=10000 ধরে নিচ্ছি প্রদত্ত ইনপুটগুলি সেমি-প্রাইমের সমষ্টি যা 1 থেকে 10000 রেঞ্জের মধ্যে রয়েছে
- সংখ্যা :=একটি নতুন তালিকা
- s_prime_flags :=MAX আকারের একটি অ্যারে এবং False দিয়ে পূরণ করুন
- একটি ফাংশন সংজ্ঞায়িত করুন get_semi_primes()। এটি লাগবে
- আমি রেঞ্জ 2 থেকে MAX - 1 এর জন্য, কর
- গণনা :=0
- সংখ্যা :=i
- j :=2
- গণনা করার সময় <2 এবং j^2 <=সংখ্যা, কর
- সংখ্যা j দ্বারা বিভাজ্য, do
- num :=num / j
- গণনা :=গণনা + 1
- j :=j + 1
- সংখ্যা j দ্বারা বিভাজ্য, do
- যদি সংখ্যা> 1 হয়, তাহলে
- গণনা :=গণনা + 1
- যদি গণনা 2 এর সমান হয়, তাহলে
- s_prime_flags[i] :=সত্য
- সংখ্যার শেষে i ঢোকান
- প্রধান পদ্ধতি থেকে নিম্নলিখিতগুলি করুন -
- কল get_semi_primes()
- i :=0
- যখন সংখ্যা[i] <=(n / 2) এর ভাগফল, কর
- যদি s_prime_flags[n - nums[i]] সত্য হয়, তাহলে
- সত্য ফেরান
- i :=i + 1
- যদি s_prime_flags[n - nums[i]] সত্য হয়, তাহলে
- মিথ্যে ফেরত দিন
আরো ভালোভাবে বোঝার জন্য আসুন নিচের বাস্তবায়ন দেখি -
উদাহরণ
MAX = 10000 nums = [] s_prime_flags = [False] * MAX def get_semi_primes(): for i in range(2, MAX): count = 0 num = i j = 2 while count < 2 and j * j <= num: while num % j == 0: num /= j count += 1 j += 1 if num > 1: count += 1 if count == 2: s_prime_flags[i] = True nums.append(i) def solve(n): get_semi_primes() i = 0 while nums[i] <= n // 2: if s_prime_flags[n - nums[i]] == True: return True i += 1 return False n = 108 print(solve(n))
ইনপুট
[4, 2, 3], 11
আউটপুট
True