我正在运行一个程序来对一个大数字进行分解,该程序输出它在经过时找到的每个因子,从最小到最大。对于低于10亿标记的数字,它适用于我测试的数字,但是当我输入1185914148403到程序时我得到一个非常奇怪的错误 - 因子311将不会打印。模数除法返回0,它进入内部while循环,但它不会打印311除非我明确检查该情况。对于低值,如622,311打印就好了,但是在这里,打印的因素较小,除了打印之外的所有内容都可以正常打印,但是没有打印任何内容。可能会发生什么?
#include <iostream>
#include <vector>
#include <ctime>
#include <string>
void nextPrime(std::vector<long long>& primes);
int main(int argc,char* argv[])
{
int startTime=clock();
long long num=std::stol(argv[1]);
long long largest=1;
std::vector<long long>primes;
primes.push_back(2);
while(1) //iterate through the prime list, divide the num down as far as pos - done when num=1
{
long long prime=primes[primes.size()-1]; //the largest prime, the one we care about
while(!(num%prime)) //while that prime divides, divide down
{
num/=prime;
largest=prime;
std::cout<<std::endl<<prime;
if(prime==311)
{
//std::cout<<std::endl<<prime;
}
}
if(num==1) //once we divide down by the largest prime factor, it'll hit 1, and we're done
{
break;
}
nextPrime(primes);
long long newPrime=primes[primes.size()-1];
if(newPrime>num)
{
break;
}
}
int endTime=clock();
double timeTaken=(endTime-startTime)/double(CLOCKS_PER_SEC);
std::cout<<"\nThat took "<<timeTaken<<" seconds\n";
std::cout<<"The largest prime factor of "<<std::stol(argv[1])<<" is "<<largest<<"\n";
}
void nextPrime(std::vector<long long>& primes)
{
long long largest=primes[primes.size()-1];
long long maybe=largest+1;
long long pt=0;
while(1)//check all the primes up to sqrt of the maybe-prime
{
long long prime=primes[pt];
if(prime*prime>maybe)
{
primes.push_back(maybe);
return;
}
if(!(maybe%prime)) //if the prime is a factor, it's not prime-try next, and go back to 1st prime
{
maybe++;
pt=0;
continue;
}
else //if not, check the next prime
{
pt++;
}
}
}
答案 0 :(得分:1)
你写道:
std::cout<<std::endl<<prime;
也许你的意思是:
std::cout << prime << std::endl;
这将打印素数然后flush the output。对于数字1185914148403
,有一个早期因素311
,然后暂时没有其他因素。
您的算法非常慢,并且在找到任何其他因素之前需要很长时间。由于在输出第一个311
后没有刷新输出,因此根据您的编译器,您可能不会在屏幕上显示该数字很长时间。
如评论中所述,std::stol
会返回long
,但您的计划会与long long
一起使用。由于您没有抛出超出范围的异常,这表明您所在的系统long
为64位。但无论如何要修复此问题并使用std::stoll
。