2016-08-12 106 views
3

我想找到从1到100的素数。我遇到的问题是当程序将值2赋给整型变量j时。变量j的值不变。有谁知道为什么发生这种情况?不能分配一个值到一个整型变量的值

创建一个程序,找出所有的素数介于1和100的方式来做到这间

一个是写,将检查的功能,如果一个号码是 素(即看是否数(如果 向量被称为素数,素数[0] = 2,素数[1] = 3,素数[2]可以除以小于自身的素数 ) == 5, 等)。然后编写一个从1到100的循环,检查每个数字 以查看它是否为素数,并存储在矢量中找到的每个素数。 写另一个列出你找到的素数的循环。您可以通过比较素数与素数的向量来检查 您的结果。 考虑2第一个素数。

+1

*如何*你知道的价值'j'不会改变?您是否使用调试器完成了代码? –

+0

我想我现在有一个真正的问题是,结果不是我想要的。 –

+0

另请注意,您将向您的矢量添加大量重复项。你可能想重新考虑你的算法。这可能是你的问题。 –

回答

4

,我们在您初步实现了一些错误:

  • 您在primes矢量太早添加元素
  • 你没有任何你认为一个明确的定义素数
  • 您正试图将所有功能放在一个函数中

一些更多的清理代码将类似于此位:

#include <iostream> 
#include <string> 
#include <vector> 

namespace { 
    bool isPrime(const std::vector<int> &previousPrimes, int possiblePrime) { 
     for (auto prevPrime : previousPrimes) 
      if (possiblePrime % prevPrime == 0) 
       return false; 

     return true; 
    } 
} 

int main() 
{ 
    auto primes = std::vector<int>({2}); 
    for (int i = 3 /*2 is already a prime*/; i <= 100; ++i) 
     if (isPrime(primes, i)) 
      primes.push_back(i); 

    for (auto prime : primes) 
     std::cout << prime << ' '; 
    std::cout << std::endl; 
} 

然而,由于这个问题看起来像一个家庭作业,不要盲目复制此,并试图了解在这里首先使用的所有概念。

+0

注意:由于所有偶数(除了2)都不是素数,所以可以增加2。 –

+0

听起来很不错! – JVApen

+0

关键字'auto'和'namespace'做了什么? –

1
#include <vector> 
#include <iostream> 
#include <string> 

int main() 
{ 
    std::vector<int> primes; 
    primes.push_back(2); 
    for(int i=3; i < 100; i++) 
    { 
     bool prime=true; 
     for(int j=0;j<primes.size() && primes[j]*primes[j] <= i;j++) 
     { 
      if(i % primes[j] == 0) 
      { 
      prime=false; 
      break; 
      } 
     } 
     if(prime) 
     { 
     primes.push_back(i); 
     std::cout << i << " "; 
     } 
    } 

    return 0; 
} 

会打印出休耕:

3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 

我们跟踪所有的先前计算素数的。如果一个数字可以被一个非素数整除,那么还有一些素数< =它也可以被除数的除数。这减少了primes_in_range/total_range因素的计算。

0

对于初学者来说,在作业中写入了来编写函数,该函数使用素数向量来检查数字是否为素数。

这个循环

for (int j = 2; j < i; ++j) 
     if (i % j == 0) 
      break; 
     else 
      primes.push_back(j); 

,因为它不使用矢量检查i是否是向量的一个元素整除没有意义。另外,一个新的质数应该在循环提供给我可以被矢量的任何一个元素整除后加入到矢量中。

还要考虑到有写在作业

然后写一个循环,变为从1 至100,检查每一个数目 看它是否是一个素

因此,只有我的代码如下所示才能满足作业。:)

该程序可以采用以下方式。我使用unsigned int类型而不是int类型,因为您只检查非负值。

#include <iostream> 
#include <vector> 

bool is_prime(const std::vector<unsigned int> &primes, unsigned int x) 
{ 
    std::vector<unsigned int>::size_type i = 0; 

    while (i < primes.size() && x % primes[i] != 0) ++i; 

    return x != 1 && i == primes.size();   
} 


int main() 
{ 
    const unsigned int N = 100; 
    std::vector<unsigned int> primes; 

    for (unsigned int i = 1; i <= N; ++i) 
    { 

     if (is_prime(primes, i)) primes.push_back(i); 
    } 

    for (unsigned int x : primes) std::cout << x << ' '; 
    std::cout << std::endl; 

    return 0; 
} 

程序输出是

2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 
0
//Thank you for all your answers, but I just figured out why. The codes are following: 

#include <iostream> 
#include <string> 
#include <vector> 

int main() 
{ 
    std::vector<int> primes = { 2 }; 
    for (int i = 2; i <= 100; ++i) 
     for (int j = 2; j < i; ++j) { 
      if (i % j == 0) 
       break; 
      if (j == i - 1) 
       primes.push_back(i); 
     } 
    for (int x: primes) 
     std::cout << x << ' '; 
    return 0; 
} 
+0

看到我的回答关于你的错误循环。 –

+0

感谢您的帮助,但我只是想到了自己 –

+0

您是否认为我的代码简短易懂? –

相关问题