簡體   English   中英

有關質數的C ++問題

[英]C++ question on prime numbers

我正在嘗試制作一個確定數字是素數還是復合數的程序。 我到目前為止。 您能給我些什么想法,以使其起作用嗎? 但是,所有素數都將是因為復合材料的值都為r> 0且r == 0,因此它們將始終被歸類為素數。 我怎樣才能解決這個問題?

int main()
{
    int pNumber, limit, x, r;               
    limit = 2;
    x = 2;

    cout << "Please enter any positive integer: " ;
    cin >> pNumber;

    if (pNumber < 0)
    {
        cout << "Invalid. Negative Number. " << endl;
        return 0;
    }
    else if (pNumber == 0)
    {   
        cout << "Invalid. Zero has an infinite number of divisors, and therefore neither composite nor prime." << endl;
        return 0;
    }
    else if (pNumber == 1)
    {
        cout << "Valid. However, one is neither prime nor composite" << endl;
        return 0;
    }
    else
    {
        while (limit < pNumber)
        {
            r = pNumber % x;
            x++;
            limit++;

            if (r > 0)
                cout << "Your number is prime" << endl;
            else 
            {
                cout << "Your number is composite" << endl;
                return 0;
            }
        }
    }

    return 0;
}

查看http://en.wikipedia.org/wiki/Prime_numberhttp://en.wikipedia.org/wiki/Primality_test

最簡單的素數測試如下:給定輸入數n,檢查從2到n − 1的整數m是否除以n。 如果n可被任何m整除,則n為合成數,否則為質數。

#include <iostream>
#include <math.h>
// Checks primality of a given integer
bool IsPrime(int n)
{
    if (n == 2) return true;
    bool result = true;
    int i = 2;
    double sq = ceil(sqrt(double(n)));
    for (; i <= sq; ++i)
    {
        if (n % i == 0)
            result = false;
    }
    return result;
}
int main()
{
    std::cout << "NUMBER" << "\t" << "PRIME" << std::endl;
    for (unsigned int i = 2; i <= 20; ++i)
        std::cout << i << "\t" << (IsPrime(i)?"YES":"NO") << std::endl; 
    std::cin.get();
    return 0;
}
bool check_prime(unsigned val) { 

    if (val == 2)
       return true;

    // otherwise, if it's even, it's not prime.
    if ((val & 1) == 0)
        return false;

    // it's not even -- only check for odd divisors.
    for (int i=3; i*i<=val; i+=2)
       if (val % i == 0)
           return false;

    return true;
}

關於您的代碼,您沒有檢查我是否輸入2將會發生什么,並且如果它是質數,您也沒有返回任何東西。 這是下面的代碼=>

#include<iostream>
using namespace std;
int main(){
    int pNumber, limit, x, r;               
    limit = 2;
    x = 2;

    cout << "Please enter any positive integer: " ;
    cin >> pNumber;

    if (pNumber < 0){
        cout << "Invalid. Negative Number. " << endl;
        return 0;
    }
    else if (pNumber == 0){   
        cout << "Invalid. Zero has an infinite number of divisors, and therefore neither composite nor prime." << endl;
        return 0;
    }
    else if (pNumber == 1){
        cout << "Valid. However, one is neither prime nor composite" << endl;
        return 0;
    }
    else if (pNumber == 2){
        cout << " Your number is prime" << endl;
        return 0;
    }
    else{
        while (limit < pNumber){
            r = pNumber % x;
            x++;
            limit++;

            if (r > 0){
                cout << "Your number is prime" << endl;
                return 0;
            }
            else{
                cout << "Your number is composite" << endl;
                return 0;
            }
        }
    }
    return 0;
}

一方面,當您找到一些x ,其中pNumber % x == 0時,您會希望跳出循環。 您需要做的就是找到pNumber大於1且小於pNumber一個因子以證明它不是素數-進一步搜索毫無意義。 如果一路找到x = pNumber卻沒有找到一個,則說明pNumber是質數。 實際上,即使您未找到pNumber平方根,它也是質數,因為如果pNumber的因數大於該因數,則它的因數應小於該因數。 說得通?

我目前為止還不知道您所教的是什么,但是我的離散數學老師是Miller-Rabin考試的粉絲。 這是一個非常准確的測試,非常容易編寫代碼,在一些基本測試中,您擁有Carmichael Number的機會非常小。 如果您的學習還沒到那兒,我會堅持一些基本的數字除法規則。

最簡單的方法是對於給定的數n,如果它可以被2到sqrt(n)之間的任何數完全可整除,則它可以是復合數,也可以是素數

嗨,我做到了這一點,也沒有使用math.h頭文件。...已經使用了turboc編譯器。 以下程序檢查數字是素數還是復合數。

                   #include<iostream.h>
                   #include<conio.h>
                   class prime
                             {
                                int a;
                                public:
                                     void check();

                             };
                             void prime::check()
                                                 {
                                                      cout<<"Insert a number";
                                                      cin>>a;
                                                      int count=0;
                                                      for(int i=a;i>=1;i--)
                                                         {
                                                            if(a%i==0)
                                                                    {
                                                                      count++;
                                                                     }
                                                         }
                                                             if(count==1)
                                                                      {
                                      cout<<"\nOne is neither prime nor composite";
                                                                       }
                                                             if(count>2)
                                                                       {
                                      cout<<"\nThe number is composite " ;
                                                                       }
                                                             if(count==2)
                                                                       {
                                      cout<<"\nThe numner is prime";
                                                                       }
                                 }

                                void main()
                                          {
                                            clrscr();
                                            prime k;
                                            k.check();
                                            getch();
                                          }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM