作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我只是写了下面的代码来利用筛法找到大于 2 的某个自然数的最大质因数。
该程序构建、运行并适用于较小的测试值,但对于大于 1000000 的值只会崩溃。
我自己写了这个——并且相信它可能会非常低效——在发现筛子是关于什么之后。
你能提出改进建议吗?
谢谢。
//LARGEST PRIME FACTOR w/SIEVE OF ERATHOSTHENES
#include <iostream>
#include <math.h>
using namespace std;
unsigned long long int numberToCheck=0;
void sieve(unsigned long long int checkNumber)
{
checkNumber=numberToCheck;
unsigned long long int root=(int)(sqrt(checkNumber));
unsigned long long int primeFlagger[checkNumber+1];
for(unsigned long long int i=0;i<=checkNumber;i++)
{
primeFlagger[i]=1;
}
primeFlagger[0]=0;
primeFlagger[1]=0;
for(unsigned long long int j=2;j<=checkNumber;j++)
{
if(primeFlagger[j]==1)
{
for(unsigned long long int k=2;(k*j)<=checkNumber;k++)
{
primeFlagger[j*k]=0;
}
}
}
for(unsigned long long int l=checkNumber;l>=0;l--)
{
if(primeFlagger[l]==1)
{
if(checkNumber%l==0)
{
cout<<l<<" is the largest prime factor"<<endl;
break;
}
}
}
}
int main()
{
cout<<"Largest prime factor less then or equal to? "<<endl;
cin>>numberToCheck;
cout<<endl;
cout<<"Retrieving largest prime factor..."<<endl;
sieve(numberToCheck);
return 0;
}
最佳答案
你的数组 unsigned long long int primeFlagger[checkNumber+1];
里面sieve
功能太长。在全局范围内使用数组,在任何函数或动态内存分配之外。
此外,您不需要 unsigned long long
.它是最大的整数数据类型,您只使用其中的一位。将类型更改为 bool 也会对您有所帮助。
还有其他问题:
unsigned long long int root=(int)(sqrt(checkNumber));
- 如果数字真的很大,sqrt(checkNumber)
可以溢出int
;unsigned long long int primeFlagger[checkNumber+1];
- checkNumber
的类型可能大于 std::size_t
- 数组索引的类型且大于可分配的最大内存区域。你只是不能使数组大小为 unsigned long long。checkNumber=numberToCheck;
- 你不需要这个。 numberToCheck
其中已经作为参数传递给函数 checkNumber
.里面sieve
checkNumber 将等于 numberToCheck
;for(unsigned long long int j=2;j<=checkNumber;j++)
- 这个循环应该结束 j<=root
.这足以标记所有非质数。如果您确实需要处理如此大的数字,请使用 segmented sieve .
关于c++ - 埃拉托色尼筛法 - 质因数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39338281/
我正在尝试编写一个函数,使用 "Sieve of Sundaram" algorithm 从 1..n 计算所有奇数素数. 这是我的尝试: sSund :: Integer -> [Integer]
我是 Haskell 的新手,对于我正在实现的事情,我需要一个素数列表。我试着写一个,但它太慢了。 这是我尝试过的。 primeList = primes 1000 primes :: Int ->
我是一名优秀的程序员,十分优秀!