C++质数程序
C++ Prime Numbers program
我正在开发一个C++程序,该程序可以确定并打印用户输入的 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"时,我得到输出:3555777779
谁能告诉我如何解决这个问题?
只要你的X
足够小,你可以使用埃拉托色尼筛来更有效地做到这一点。这是"素数最多 X"情况的理想选择,因为它保留了以前丢弃的素数的记忆。它通过为每个候选编号保留一组标志来实现这一点,所有标志最初都设置为 true(当然,1 除外)。
然后,你取第一个真值 (2),将其输出为素数,然后将该值的所有倍数的标志设置为 false。
然后继续:
- 3;
- 5(因为 4 是 2 的倍数);
- 7(因为 6 是 2 和 3 的倍数);
- 11(因为 8 和 10 是 2 的倍数,9 是 3 的倍数);
- 13(因为 12 是 2 的倍数);
- 17(因为 14 和 16 是 2 的倍数,15 是 3 和 5 的倍数);
- 等等。
伪代码类似于:
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
。
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;
}
打印从 1 到 100 的质数基本上这个,但修改了
我发现这个非常快速和高效
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;
}
相关文章:
- Mongodb c++驱动程序:如何查询元素的数组
- C++,系统无法执行指定的程序
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- C++ Windows 驱动程序MSB3030无法复制该文件,因为它找不到
- 重载操作程序时出错>>用于类中的字符串 memebr
- 获取日期异步信号安全吗?如果在信号处理程序中使用,它会导致死锁吗
- 试图在visual studio上用C++创建一个桌面应用程序
- 模板元程序查找相似的连续类型名称
- FFmpeg:制作一个应用程序比直接使用ffmepg更好吗
- 如何通过cpp程序运行shell脚本
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- IPC使用多个管道和分支进程来运行Python程序
- 如何将c++程序的一些输出传递给shell,以便在shell中使用
- 使用C++程序合并排序没有得到正确的输出
- 基于boost的程序的静态链接——zlib问题
- 程序崩溃并显示"std::out_of_range"错误
- 在C应用程序中运行C++(带有STL)函数
- 使用mongocxx驱动程序时包含头文件问题
- 如何在c++程序中找到函数的地址