Несоответствие с std :: cout — не удается напечатать на определенных номерах

Я запускаю программу для факторизации большого числа, которая выводит каждый найденный фактор по мере прохождения от наименьшего к наибольшему. Насколько я тестировал, он отлично работает для чисел ниже отметки 1 миллиард, но при вводе 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

Решение

Ты пишешь:

std::cout<<std::endl<<prime;

Может быть, вы имели в виду:

std::cout << prime << std::endl;

Это напечатает премьер, а затем очистить вывод. Для числа 1185914148403есть ранний фактор 311 и тогда больше никаких факторов на время.

Ваш алгоритм очень медленный и занимает много времени, прежде чем он находит какой-либо другой фактор. Так как вы не сбросили вывод после вывода первого 311затем, в зависимости от вашего компилятора, этот номер может не отображаться на экране в течение очень длительного времени.


Как отмечено в комментариях, std::stol возвращает longОднако ваша программа работает с long long, Поскольку вы не получили исключение вне диапазона, это означает, что вы находитесь в системе, где long является 64-битным Но было бы хорошо, чтобы все это исправить и использовать std::stoll,

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]