算法描述
前几天在网上看了一个算法,据说是网易的面试题,描述如下:
- f(x)为x最大的奇数约数,x为正整数。例如:f(44) = 11.
- 现在给出一个N(1 ≤ N ≤ 1000000000),
- 需要求出 f(1) + f(2) + f(3)…f(N)
- 例如:N = 7 f(1) + f(2) + f(3) + f(4) + f(5) + f(6) + f(7) = 1 + 1 + 3 + 1 + 5 + 3+ 7 = 21
乍一看觉得挺简单,循环计算1-N的最大奇约数相加就行了,但是当N为1000000000时,程序会计算很久。
那应该怎么样优化呢?
思路一
首先,我们先来分析一下怎么计算N的最大奇数约数,当N为奇数时最大奇数约数就是N本身,当N为偶数时,偶数循环除以2,当结果为奇数时这个奇数就是最大奇数约数。所以我们优化后的步骤就是:
- 计算1-N所有的奇数之和
- 在循环偶数得出偶数的最大奇数约数
- 最后求和
这个算法的效率要比开始的提高了不少,但是当N为1000000000,计算结果还是很慢。
我们继续优化
思路二
思路一的算法慢在需要循环偶数除2,当N足够大的时候会比较耗时,我们从此处入手,思路一的第一步求所有奇数的和,那剩下的就是1-N之间的所有偶数了。例如:<