প্রাইমস লেটকোড সমাধানগুলি গণনা করুন


কাঠিন্য মাত্রা সহজ
প্রায়শই জিজ্ঞাসা করা হয় মর্দানী স্ত্রীলোক আপেল ক্যাপিটাল ওয়ান গুগল মাইক্রোসফট
হ্যাশ ম্যাথ

এই সমস্যায়, আমাদের একটি পূর্ণসংখ্যা দেওয়া হয়, এন The লক্ষ্যটি এন থেকে কম সংখ্যক কীভাবে প্রাইম হয় তা গণনা করা। পূর্ণসংখ্যাটি অ-নেতিবাচক হওয়ার জন্য সীমাবদ্ধ।

উদাহরণ

7
3
10
4

ব্যাখ্যা

10 এর চেয়ে কম পুরষ্কার 2, 3, 5 এবং 7 হয়। সুতরাং, গণনা 4।

পন্থা (ব্রুট ফোর্স)

সাধারণ পদ্ধতির প্রতি প্রতিটি পূর্ণসংখ্যার এন এর চেয়ে কম পরীক্ষা করা এবং ফলাফলটি যদি প্রধান হয় তবে বৃদ্ধি করা। উদাহরণস্বরূপ, এন = 10 বিবেচনা করুন এখন, এই ব্যাপ্তিতে কতগুলি প্রাইম রয়েছে তার সন্ধানের জন্য আমরা 2 থেকে N - 1 পর্যন্ত একটি চেক চালাতে পারি। তবে, এই পদ্ধতির জন্য পুরো পরিসীমাটিতে একটি প্রাথমিক চেক দরকার, [2, এন - 1]।  সুতরাং, এটি ধীর।

আমরা কিছু অপ্টিমাইজেশন যেমন করতে পারি:

  1. 2 ব্যতীত প্রতিটি মৌলিক সংখ্যা একটি বিজোড় পূর্ণসংখ্যা। তাহলে পরে 2, আমরা কেবল বিজোড় পূর্ণসংখ্যার জন্য পরীক্ষা করতে পারি।
  2. কোনও সংখ্যা প্রাইম ইন কিনা তা আমরা পরীক্ষা করতে পারি ও (√N) অ্যালগরিদম উন্নত করার সময়।

যাইহোক, আমরা এখনও এই নিবন্ধে পরে আলোচনা করা একটি আরও ভাল পদ্ধতির আছে।

অ্যালগরিদম

  1. সংখ্যাটি যদি কম হয় 3, ফিরে 0, 2 হিসাবে সবচেয়ে ছোট প্রধানমন্ত্রী
  2. 3 থেকে শুরু করে সমস্ত সংখ্যা পরীক্ষা করে একটি লুপ চালান
  3. একটি সংখ্যা, এন প্রধান হয় যদি:
    • ইহা ছিল 2 এবং মধ্যে প্রধান কারণ .N
  4. সংখ্যাটি যদি প্রধান হয় তবে ইনক্রিমেন্টের ফলাফল
  5. ফলাফল মুদ্রণ করুন

গণনা প্রাইমস লেটকোড সমাধানগুলি বাস্তবায়ন

সি ++ প্রোগ্রাম

#include <bits/stdc++.h>
using namespace std;

bool isPrime(int N)
{
    for(int i = 2 ; i * i <= N ; i++)
        if(N % i == 0)
            return false;
    return true;
}


int countPrimes(int N)
{
    if(N < 3)
        return 0;
    int cnt = 1;
    for(int i = 3 ; i < N ; i += 2)
        if(isPrime(i))
            cnt++;

    return cnt;
}


int main()
{
    int N = 10;
    cout << countPrimes(N) << '\n';
}

জাভা প্রোগ্রাম

class count_primes
{
    static boolean isPrime(int N)
    {
        for(int i = 2 ; i * i <= N ; i++)
            if(N % i == 0)
                return false;

        return true;
    }

    static int countPrimes(int N)
    {
        if(N < 3)
            return 0;
        int cnt = 1;//since number is atleast 3, 2 is a prime less than N
        for(int i = 3 ; i < N ; i += 2)
            if(isPrime(i))
                cnt++;
        return cnt;
    }

    public static void main(String args[])
    {
        int N = 10;
        System.out.println(countPrimes(N));
    }
}

4

গণনা প্রাইমস লেটকোড সমাধানগুলির জটিলতা বিশ্লেষণ

সময় জটিলতা

আমরা এর জন্য একটি লুপ চালাই এন / এক্সএনএমএক্স বার প্রতিটি পরীক্ষায়, জটিলতার সময় ও (এন / 2) (গড় হিসাবে গ্রহণ করে) এন / 2) ব্যয় করা হয়। সুতরাং, এই অ্যালগরিদমের সময় জটিলতা ও (N√N)

স্থান জটিলতা

ও (1), ধ্রুবক ভেরিয়েবলের জন্য কেবল স্থির স্থান ব্যবহার করা হয়।

পদ্ধতির (অনুকূল পদ্ধতি)

যেকোন মূল সংখ্যা বিবেচনা করুন, বলুন 5, তারপরে এটি নিশ্চিত যে নিজের ব্যতীত 5 এর সমস্ত গুণগুলি কখনই প্রধান হতে পারে না কারণ তাদের 5 টি তাদের প্রধান কারণ হিসাবে থাকবে। একইভাবে, আমরা N এর চেয়ে কম এবং এর চেয়েও বড় সমস্ত সংখ্যা সঞ্চয় করতে পারি 0

The Olymp Trade প্লার্টফর্মে ৩ টি উপায়ে প্রবেশ করা যায়। প্রথমত রয়েছে ওয়েব ভার্শন যাতে আপনি প্রধান ওয়েবসাইটের মাধ্যমে প্রবেশ করতে পারবেন। দ্বিতয়ত রয়েছে, উইন্ডোজ এবং ম্যাক উভয়ের জন্যেই ডেস্কটপ অ্যাপলিকেশন। এই অ্যাপটিতে রয়েছে অতিরিক্ত কিছু ফিচার যা আপনি ওয়েব ভার্শনে পাবেন না। এরপরে রয়েছে Olymp Trade এর এন্ড্রয়েড এবং অ্যাপল মোবাইল অ্যাপ। ইরোটোথিনিসের চালনী এন এর চেয়ে কম প্রাইম সন্ধান করার জন্য একটি প্রাচীন এবং দক্ষ অ্যালগরিদম ও (এন) বরাদ্দ করার জন্য এন যথেষ্ট ছোট স্মৃতিতে স্থান। এটি পুনঃনির্বাচিতভাবে সমস্ত অ-মৌলিক সংখ্যাগুলিকে সম্মিলিত হিসাবে চিহ্নিত করে মুছে ফেলে elim সমস্ত সংমিশ্রণ চিহ্নিত হওয়ার পরে, যে সংখ্যাগুলি চিহ্নযুক্ত নয় সেগুলি প্রাইম হয়।

এছাড়াও, আমাদের একটি বুলিয়ান সংরক্ষণ করতে হবে বিন্যাস কোনও নম্বর চিহ্নিত হয়েছে কিনা তা যাচাই করতে যা মেমরির ব্যবহারের জন্য অ্যাকাউন্ট করে। সুতরাং, এটি একটি ক্ষেত্রে যেখানে আমরা বাণিজ্য স্মৃতি বন্ধ সময়মতো উন্নতি করুন.

প্রাইমস লেটকোড সমাধানগুলি গণনা করুন

অ্যালগরিদম

  1. বুলিয়ান অ্যারে বজায় রাখুন মৌলিক সমান আকার এন - 1
  2. প্রধান[] কম্পোজিটগুলি চিহ্নিত করতে এবং শেষে প্রাইমগুলি পরীক্ষা করতে ব্যবহৃত হয়
  3. প্রতিটি পূর্ণসংখ্যার প্রাইম হিসাবে সূচনা করুন সত্য। অ্যালগরিদম সেট মিথ্যা প্রতিটি অ-মৌলিক সংখ্যায়
  4. 2 থেকে শুরু করে পূর্ণসংখ্যার প্রথম একাধিক হওয়া পর্যন্ত এক লুপ চালান এন এর চেয়ে কম:
    • প্রতিটি পূর্ণসংখ্য x এর জন্য, যদি এর মান [x] সত্য হিসাবে থাকে তবে এর সমস্তগুলি এক হিসাবে চিহ্নিত করুন মিথ্যা
    • এখানে প্রতিটি পূর্ণসংখ্যার একাধিক থেকে শুরু হয় x * x যেহেতু এক্স এর অন্যান্য সমস্ত গুণাবলী ইতিমধ্যে চিহ্নিত করা হবে।
  5. পরিশেষে [2, N - 1] এর মধ্যে কতগুলি সংখ্যা রয়েছে তা পরীক্ষা করে দেখুন সত্য প্রধান টেবিলে
  6. ফলাফল মুদ্রণ করুন

গণনা প্রাইমস লেটকোড সমাধানগুলি বাস্তবায়ন

সি ++ প্রোগ্রাম

#include <bits/stdc++.h>
using namespace std;

int sieve(int N)
{
    if(N < 3)
        return 0;

    int cnt = 0;
    bool prime[N];
    for(int i = 2 ; i < N ; i++)
        prime[i] = true;

    for(int i = 2 ; i * i < N ; i++)
    {
        if(prime[i])
            for(int j = i * i ; j < N ; j += i)
                prime[j] = false;
    }

    for(int i = 2 ; i < N ; i++)
        if(prime[i])
            cnt++;

    return cnt;
}

int countPrimes(int N)
{
    if(N < 3)
        return 0;
    return sieve(N);
}


int main()
{
    int N = 10;
    cout << countPrimes(N) << '\n';
}

জাভা প্রোগ্রাম

class count_primes
{
    static int sieve(int N)
    {
        if(N < 3)
            return 0;

        int cnt = 0;
        boolean[] prime= new boolean[N];
        for(int i = 2 ; i < N ; i++)
            prime[i] = true;

        for(int i = 2 ; i * i < N ; i++)
        {
            if(prime[i])
                for(int j = i * i ; j < N ; j += i)
                    prime[j] = false;
        }

        for(int i = 2 ; i < N ; i++)
            if(prime[i])
                cnt++;

        return cnt;
    }

    static int countPrimes(int N)
    {
        if(N < 3)
            return 0;
        return sieve(N);
    }

    public static void main(String args[])
    {
        int N = 10;
        System.out.println(countPrimes(N));
    }
}

4

গণনা প্রাইমস লেটকোড সমাধানগুলির জটিলতা বিশ্লেষণ

সময় জটিলতা

অ্যালগরিদমের জটিলতা ও (এনলগ (লগএন))। এটি হিসাবে প্রমাণিত হতে পারে:

প্রতিটি পূর্ণসংখ্যার জন্য এক্স, আমরা একটি সময় ব্যয় করি এন / এক্স এর সমস্ত গুণকগুলি অপসারণ করছে।

সুতরাং, মোট সময় ব্যয় করা হয়: এন / 2 + এন / 3 + এন / 5 + এন / 7 + ……

সাধারণ হিসাবে এন গ্রহণ, টি (এন) = এন (1/2 + 1/3 + 1/5 + 1/7 +…)। সিরিজের সমষ্টি (1/2 + 1/3 + 1/5 + 1/7 +…) হিসাবে প্রমাণিত হতে পারে লগ (লগএন)।

অতএব, টি (এন) = এনলগ (লগএন)

স্থান জটিলতা

চালু), যেহেতু আমরা কোনও হ্যাশ টেবিল তৈরি করে রাখি যদি কোনও সংখ্যা প্রধান হয় বা না।