c++ - 如何编写一个快速函数来计算一个数的总除数?

标签 c++ algorithm numbers primes

我必须找到给定数字 N 的除数总数,其中可以大到 10^14。我尝试计算最大为 10^7 的素数,然后使用素数的指数找到除数factors.However 事实证明它太慢了,因为使用筛子找到素数需要 0.03 秒。如何在不计算素数的情况下更快地计算除数总数?请伪代码/很好解释的算法将不胜感激。

最佳答案

使用阿特金筛法找出所有小于 10^7 的素数。 (其中有 664,579 个)

http://en.wikipedia.org/wiki/Sieve_of_Atkin

理想情况下,这应该在编译时完成。

接下来计算质因数分解:

int x; // the number you want to factor
Map<int to int> primeFactor; // this is a map that will map each prime that appears in the prime factorization to the number of times it appears.

while(x > 1) {
  for each prime p <= x {
     if x % p == 0 {
       x = x / p; 
       primeFactor(p) = primeFactor(p) +1;
     }
  }
}

最后,您将获得完整的质因数分解。由此,您可以通过遍历映射的值来计算除数的总数: https://math.stackexchange.com/questions/66054/number-of-combinations-of-a-multiset-of-objects

int result = 1;
for each value v in primeFactors {
  result*= (v+1);
}

关于c++ - 如何编写一个快速函数来计算一个数的总除数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12288671/

相关文章:

c++ - 从客户端向服务器传输文件时缺少字节,字节值也代表一些控制字符

c++ - 在给定范围内查找对值

c++ - 奇怪的 C++ 内存分配

c++ - 从物理输入更改音频流

c++ - 算法能否安全地解决输入到输出的 self 分配问题?

javascript - 如何禁用字母和特殊字符的粘贴选项但为数字启用

java - 将 JTextField 输入限制为整数

mysql - 数值超出范围 : 1690 BIGINT UNSIGNED value is out of range in

c++ - 链表中的指针

arrays - 在二分查找中,为什么向后遍历比向前遍历花费更多?