[英]Inconsistency with std::cout - failing to print on specific numbers
我正在運行一個程序來分解一個大數,它輸出它在通過時找到的每個因子,從最小到最大。 據我測試,它對於 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++;
}
}
}
你寫:
std::cout<<std::endl<<prime;
也許你的意思是:
std::cout << prime << std::endl;
這將打印素數,然后刷新輸出。 對於數字1185914148403
,有一個早期的因子311
,然后有一段時間沒有更多的因子。
您的算法非常慢,需要很長時間才能找到任何其他因素。 由於您在輸出第一個311
后沒有刷新輸出,因此根據您的編譯器,您可能在很長一段時間內都不會在屏幕上顯示該數字。
正如評論中所指出的, std::stol
返回一個long
,但是您的程序可以使用long long
。 由於您沒有收到超出范圍的異常拋出,這表明您在一個long
是 64 位的系統上。 但無論如何解決這個問題並使用std::stoll
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.