给定数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
答案 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
注意:
你只想计算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