3

我昨天开始读一本关于 C++ 的书。到目前为止,我有 100 页,并用这个数字编写了我的第一个程序。我希望它找出给定的数字是否是质数。

我有两个问题。

  1. 我知道我的方法是好的。该程序正在检查每个使程序变大的数字。这样做的理想方法是什么?如果我理解你的答案也没关系,我稍后会简单地阅读命令:)。

  2. 我的"Result+=1"线路有很大的问题。起初我有i=1,这给了我以下结果7

    1111112

嗯,我也知道为什么。对于 6 第一个 for 循环,他找到了一个数字(1)和最后一个2(1,7)。但这显然不是我想要的工作方式。我希望 Result 成为某种计数器。我怎么做?

编码:

#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;
}
4

5 回答 5

3

你的逻辑很好奇,正如你所说的非常低效。这是一个更好的逻辑

检查从 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

顺便说一下,这段代码可以进一步改进,但这对你来说是一个练习。

于 2012-11-03T08:39:38.277 回答
1

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

#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 函数中的测试用例数量,从而使代码更加高效。希望这可以帮助。

于 2014-05-13T11:56:40.433 回答
0

关于您的问题,我认为您的方法非常可靠:

为什么我从 i=2 开始?

好吧,我对素数的定义是一个有 2 个因数的数字:1 和它本身。因此,当您从一个开始时(正确)计算一个额外的因子,因为 prime_number 完全可以被 1 整除。这会给您一个结果计数 2,因为它找到了两个因子。

更好的方法是什么?

有几种更好的方法,有些更复杂;但是,您现在拥有的算法可以通过几种直接方式轻松改进:

  • 一旦你找到任何不是 1 或素数的因子,那么你就知道这个数不是素数,只要有任何 (primenumber%i)==0 你就可以设置一个像IsPrime=false这样的标志并 跳出循环.
  • 即使对于素数,您也不需要上升到素数,因为可能的最大因素是素数/2 - 因此您的循环速度会快两倍,并且在这种情况下也能正常工作。2. 编辑:实际上,如果您考虑一下,素数的平方根是一个足够好的限制,因为所有因素都是成对出现的,而较小的因素总是在这个限制之内。

希望你学习愉快。

于 2012-11-03T08:36:41.870 回答
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);
    }

}
于 2015-03-21T04:42:39.500 回答
0

您也可以检查以下代码:

#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;
}
于 2012-12-20T11:32:01.540 回答