我正在研究一个C ++程序,它确定并打印3到3之间的素数和用户输入的整数'x'。我假设我需要一个双嵌套循环,一个从3迭代到x,另一个检查数字是否为素数。我认为它需要做一些像从2到x-1的事情?我真的不确定如何在语法方面做到这一点。谢谢你的帮助! :)
编辑: 这就是我所拥有的:
#include <iostream>
#include <cmath>
using std::cout;
using std::endl;
using std::cin;
int main(){
int x;
int i;
int j;
cout << "Please enter an integer 'x' greater than 3: " << endl;
cin >> x;
if (x <= 3){
cout << "Please enter new value 'x' greater than 3: " << endl;
cin >> x;
}
for(int i=3; i<=x; i++){
for(j=2; j<i; j++){
if(i%j == 0)
break;
else if(i == j+1);
cout << i << endl;
}
}
return 0;
}
当我输入10作为'x'时,我得到输出: 3 五 五 五 7 7 7 7 7 9
有谁能告诉我如何解决这个问题?
答案 0 :(得分:1)
如果您的X
足够小,您可以使用Eratosthenes的Sieve来更有效地完成它。这对于“素数达到X”的情况是理想的,因为它保留了先前丢弃的素数的记忆。它通过为每个候选编号保留一组标记来实现,所有这些标记最初都设置为true(当然除了1)。
然后取第一个真值(2),输出为素数,然后将其所有倍数的标志设置为false。
然后继续:
伪代码类似于:
def showPrimesUpTo (num):
// create array of all true values
array isPrime[2..num] = true
// start with 2 and go until finished
currNum = 2
while currNum <= num:
// if prime, output it
if isPrime[currNum]:
output currNum
// also flag all multiples as nonprime
clearNum = currNum * 2
while clearNum <= num:
isprime[clearNum] = false
clearNum = clearNum + currNum
// advance to next candidate
currNum = currNum + 1
否则,您可以根据自己的建议进行试验。基本思路是检查从2到目标数字的平方根的每个数字,看它是否是倍数。在伪代码中,这将是:
def isPrime (num):
// val is the value to check for factor
val = 2
// only need to check so far
while val * val <= num:
// check if an exact multiple
if int (num / val) * val == num:
return false
// no, carry on
val = val + 1
// if no factors found, it is a prime
return true
你只需要检查平方根的原因是,如果你在那里找到一个因子,你就已经找到了相应的因子 平方根。
例如,3 x 17
为51
。如果您要检查2到50之间的数字,看看51
是否为素数,您首先会找到3
,这意味着您永远不需要检查17
。
答案 1 :(得分:0)
int main (char argv)
{
int tempNum = atoi(argv);
for (int i=3; i<=tempNum; i++)
for (int j=2; j*j<=i; j++)
{
if (i % j == 0)
break;
else if (j+1 > sqrt(i)) {
cout << i << " ";
}
}
return 0;
}
Printing prime numbers from 1 through 100 基本上这个,但修改了
答案 2 :(得分:0)
我发现这个非常快速有效
int main(){
for(int i=3; i<=X; i++)
if(IsPrime(i)){
cout<<i<<endl;
}
}
bool IsPrime(int num){
/* use commented part if want from 2
if(num<=1)
return false;
if(num==2)
return true;
*/
if(num%2==0)
return false;
int sRoot = sqrt(num*1.0);
for(int i=3; i<=sRoot; i+=2)
{
if(num%i==0)
return false;
}
return true;
}