码迷,mamicode.com
首页 > 其他好文 > 详细

因子平方和

时间:2016-04-18 23:55:16      阅读:293      评论:0      收藏:0      [点我收藏+]

标签:

6 的因子有 1, 2, 3 和 6, 它们的平方和是 1 + 4 + 9 + 36 = 50. 如果 f(N) 代表正整数 N 所有因子的平方和, 那么 f(6) = 50.
现在令 F 代表 f 的求和函数, 亦即 F(N) = f(1) + f(2) + .. + f(N), 显然 F 一开始的 6 个值是: 1, 6, 16, 37, 63 和 113.
那么对于任意给定的整数 N (1 <= N <= 10^8), 输出 F(N) 的值.
这题咱们要慢慢的看
首先,我试了一下10,发现一个规律:(对于总共的所有因子)
因子数字:1 2 3 4 5 6 7 8 9 10
因子个数:10 5 3 2 2 1 1 1 1 1
n/2以后都是1啊
然后前面的个数都是n/1取整
那么1~n/2就这么写一下:1**2*(n/1),第二个2**2*(n/1),以此类推
然后再观察一下,到根号n的时候,都是不一样的数字,根号n之后有一样的数字
那么,把根号n之前的加在一起做第一个和
然后发现,1到最后一个,也就是n,2到n/2个
由平方和公式 

技术分享

4~10的平方和等于1~10减去1~3

观察,根号n后面有一个4~10,一个4~5

也就是一个根号n到n/1(对应的数1),一个根号n到n/2(对应数2)

ps:这个2是根号n-1

那么写出程序计算分开计算,记得先算出1到根号n的平方和,别重复计算

N = 10
n0 = N**(1/2.0)
if n0 > int(n0)+0.4:
    n0 = int(n0)+1
else:
    n0 = int(round(n0))
S = 0
s = n0*(n0+1)*(2*n0+1)/6
for i in range(1, n0+1 ):
    S += (i**2)*(N/i)
for j in range(1, n0):
    n = N/j
    S += n*(n+1)*(2*n+1)/6 - s
print S
测试的时候发现2,12等不对,然后发现当小数第一位大于4,比如根号2=1.414,这里就要进上去,根号2等于2
具体为啥我也不太清楚,规律吧。。。

因子平方和

标签:

原文地址:http://www.cnblogs.com/webgavin/p/5406132.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!