与std :: cout不一致 - 无法打印特定数字

时间:2016-03-06 21:43:22

标签: c++ cout factors

我正在运行一个程序来对一个大数字进行分解,该程序输出它在经过时找到的每个因子,从最小到最大。对于低于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++;
        }
    }
}

1 个答案:

答案 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