我刚写了以下内容,利用筛子找到一个大于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;
}
答案 0 :(得分:1)
unsigned long long int primeFlagger[checkNumber+1];
func中的数组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
内{checkNummber}将等于numberToCheck
; for(unsigned long long int j=2;j<=checkNumber;j++)
- 此循环应结束j<=root
。这足以标记所有非原始数字。如果您真的需要处理如此大的数字,请使用segmented sieve。