为什么我不能超过一定数量级的质因数?

Why can't I prime factor numbers above a certain magnitude?

我正在尝试用 C++ 编写一个程序,该程序将对 12 位数字进行质因数分解。这是我的代码:

#include <iostream>
using namespace std;

int main()
{
  long double userInput;
  long double divisor = 2;
  long double dividend;

  cout << "Enter number:   ";
  cin >> userInput;
  dividend = userInput;

  do
  {
    while (static_cast<int>(dividend) % static_cast<int>(divisor) == 0)
    {
      cout << divisor << endl;
      dividend = dividend / divisor;
    }

    divisor++;

  } while (dividend > 1);

  return 0;
}

这(至少看起来)对于较小的数字工作正常,但当我使用非常大的数字时它会崩溃。为什么是这样?我需要使用更大的整数类型吗?还是代码本身有问题?

使用 long double 进行因式分解没有多大意义。您需要一个大整数类型来表示整数。 double 通常是 64 位,但它 "wastes" 其中的几个位用于指数,因此它可以表示小数,也可以表示数量级非常大但精度降低的数字。

此外,您在除以之前将股息和除数转换为 intint 通常是 32 位,这意味着任何超过 20 亿(10 位数字)的数字都会溢出,给出无意义的结果。它 可以 窄到 16 位,这使它的范围仅为 -32768 到 +32767;你通常不应该假设它一定比那个更宽。

如果您的编译器支持(它可能支持),请使用类型 long long,它至少是 64 位。这将近 19 位小数,足以满足您的要求。