簡體   English   中英

C ++,確定素數

[英]C++, determine prime number

我昨天開始讀一本關於C ++的書。 到目前為止,我只有100頁並用這個數字來編寫我的第一個程序。 我希望它能找出給定數字是否為素數。

我有2個問題。

  1. 我知道我的方法不是好事。 該程序正在檢查使程序變大的每個數字。 這樣做的理想方式是什么? 如果我理解你的答案並不重要,我會稍后閱讀這些命令:)。

  2. 我對"Result+=1"行有一個很大的問題。 起初我有i=1 ,這給了我7號的以下結果。

    1111112

好吧,我也知道為什么。 對於6個第一個for循環,他找到了一個數字(1) ,最后一個為2(1,7) 但那顯然不是我想要的方式。 我希望結果是一種反擊。 我怎么做?

代碼:

#include <iostream>
using namespace std;



// Hauptprogramm

int main ()
{
    // Variablen
    int Prime_number;
    int Result = 0;

    // Abfragen
    cout << "Please enter possible prime number: ";
    cin >> Prime_number;

    // Rechnen
    for (int i=2; i <= Prime_number ; i++)
    {   
            if (Prime_number%i == 0)
            {   
                    Result +=1;
            }
    }

    // Ausgabe
    if(Result == 1)
    {
            cout << "You got a prime number!" << endl;
    }
    else
    {
            cout << "No luck" <<endl;
    }

    return 0;
}

你的邏輯是好奇的,正如你所說的非常低效。 這是一個更好的邏輯

檢查從2到Prime_number - 1的每個數字,如果它們中的任何一個完全分開,則它不是素數,否則它是。 重要的一點是,你停止尋找一個除數,因為那時你知道你的問題的答案。 這是一些代碼

bool prime = true;
for (i = 2; i < Prime_Number; ++i)
{
    if (Prime_Number % i == 0)
    {
        prime = false;
        break;
    }
}
if (prime)
    cout << "You got a prime number!" << endl;
else
    cout << "No luck" <<endl;

我認為你在嘗試中遺漏的兩點是使用bool變量,以及一旦你知道它完成就可以break循環的事實。

順便說一下,這個代碼可以進一步改進,但這對你來說是一個練習。

在以下代碼中可以看到更有效的方法

#include<iostream>
#include<algorithm>
bool isprime(int a)
{
    int count=0;
    for(int i=2;i<sqrt(a);i++)
    {
        if(a%i==0)
        {count++;}
    }
    if(a==1||count!=0) return false;
    else return true;
}
int main()
{
  int a;
  cin>>a;
  if(isprime(a))
  {
    cout<<"number is prime";
  }
  else cout<<"number is not prime";
  return 0;
}

正如您所看到的,這會以指數方式減少isprime函數中的測試用例數量,從而使代碼更加高效。 希望這可以幫助。

關於你的問題,我認為你的方法非常可靠:

為什么我從i = 2開始?

我對素數的定義是一個有2個因子的數字:1和它本身。 所以當你從一個開始時,你(正確)計算一個額外的因子,因為prime_number可以被1整除。然后它給你一個結果數為2,因為它找到了兩個因子。

有什么更好的方法?

有幾種更好的方法,一些明顯更復雜; 但是,您現在可以通過以下幾種方式輕松改進現有算法:

  • 一旦你發現任何不是1或primenumber的因子,你就知道這個數字不是素數,只要任何(primenumber%i)== 0,你就可以設置一個像IsPrime = false的標志並突破循環。
  • 即使對於素數,你也不需要上升到primenumber,因為可能的最大因素是primenumber / 2 - 所以你的循環速度會快兩倍,在這種情況下工作也一樣好。 2.編輯:實際上,如果你仔細考慮一下,素數的平方根是一個足夠好的限制,因為所有因子成對出現,而較小的因子總是在這個限度內。

希望你學習有趣。

您也可以檢查以下代碼:

#include "time.h"
#include "iostream"
#include "conio.h"
using namespace std;

int main()
{
    div_t divresult;
    time_t t1,t2;   
    t1 = time(NULL); 
    int prime[1501] = {0};
    prime[1] = 2;
    prime[2] = 3;
    prime[3] = 5;
    prime[4] = 7;
    prime[5] = 11;
    int count = 6;

    for(int i = 12; count < 1500; i +=1)
    {
        bool Bprime = true; 
        for(int j = 1; j < count; j+=1)
        {
            if(i%prime[j] == 0) Bprime = false;
        }
        if(Bprime == true) prime[count++] = i;
    }
    t2 = time(NULL);
    divresult = div(t2-t1,60);
    cout<<divresult.quot <<" min "<<divresult.rem<<" sec"<<endl;
    int n = 0;
    cout<<"Give Value of N:";
    cin>> n;
    cout<<n<<"th prime is: "<<prime[n-1]<<endl;     

    _getch();
    return 0;
}
#include <stdio.h> 
#include <cmath>

bool BePrime(unsigned int N){
    if(N == 2) return true;

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

main(){
    int a;
    while(scanf("%d",&a)){
        if(BePrime(a)) {
            printf("%d is Prime\n", a);
            continue;
        }
        printf("%d is not Prime\n", a);
    }

}

暫無
暫無

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

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