如何找到N的除数总数?

时间:2011-09-06 17:09:56

标签: number-theory

给定数N,必须找到所有i的除数,其中i> = 1且i <= N.无法理解。我是否需要使用素数分解?极限是N <= 10 ^ 9 样本输出:

1 --> 1
2 --> 3
3 --> 5
4 --> 8
5 --> 10
6 --> 14
7 --> 16
8 --> 20
9 --> 23
10 --> 27
11 --> 29
12 --> 35
13 --> 37
14 --> 41
15 --> 45

3 个答案:

答案 0 :(得分:12)

要计算得更快,请使用以下伪代码:

sum = 0; u = floor(sqrt(N)); foreach k <= u, sum += Floor(N / K); sum = 2*sum-u*u

上述公式由Peter Gustav Lejeune Dirichlet在19世纪给出。

我使用上述算法编写了一个C程序,在我的计算机上需要0.118秒才能计算从1到10 ^ 14的除数数之和。答案是3239062263181054。

答案 1 :(得分:2)

如果你想找到给定N的所有除数之和,你不需要任何因子。你可以用这种方式(例如)使用一个独特的循环来完成它。 从2开始,2是2 * 2,3 * 2,4 * 2的除数,依此类推。这给出了背后的想法。

Foreach k&lt; N,Floor(N / k)是k是某事的除数的次数&lt; Ñ

伪代码:
sum = 0; foreach k <= N sum += Floor(N / K)

请注意,这与询问给定N的除数的数量不同。

答案 2 :(得分:0)

不确定您使用的是哪种语言,但这是基本想法:

dim myCount as integer = 1
dim N as integer = 10000000000 '10,000,000,000

For i as integer = 2 to N
   If N mod i = 0 Then
      myCount += 1
   End If
Next i

注意:

  • Mod为您提供剩下的分工。例如:
  • 10 mod 1 = 0(因为1完全10次10​​次)
  • 10 mod 2 = 0(...
  • 10 mod 3 = 1(因为3进入10 3次,其余为1)
  • 10 mod 4 = 2(因为4次进入10次2次,剩余次数为2次)

你只想计算N mod i = 0的结果,因为那些是我进入N而没有余数的唯一实例;哪个我认为是你的老师在说'除数'时可能意味着什么 - 没有余数。

对于您正在使用的任何语言,变量声明(dim ...)和For循环可能会略有不同。上面的代码是VB。但是如果你查看你的图书索引,你可能会找到这两种常见功能的语言版本。

修改

好的 - 在这种情况下,只需添加另一个FOR循环,如下所示:

dim myCount as integer = 1
dim N as integer = 10000000000 '10,000,000,000

For i as integer = 1 to N
   For j as integer = 2 to i
      If i mod j = 0 Then
         myCount += 1
      End If
   Next j
Next i