簡體   English   中英

與 std::cout 不一致 - 無法打印特定數字

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM