算法:1-N的最大奇数约数之和

文章介绍了如何高效地计算1到N的最大奇数约数之和,这是一个优化算法的问题。当N为偶数时,通过不断除以2并求奇数约数,减少了循环次数,实现了对于大数N如1000000000也能快速计算。文章提供了Python实现代码,并鼓励读者尝试更大数值的计算。
摘要由CSDN通过智能技术生成

算法:1-N的最大奇数约数之和

算法描述

前几天在网上看了一个算法,据说是网易的面试题,描述如下:

  • 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. 计算1-N所有的奇数之和
  2. 在循环偶数得出偶数的最大奇数约数
  3. 最后求和

这个算法的效率要比开始的提高了不少,但是当N为1000000000,计算结果还是很慢。

我们继续优化

思路二

思路一的算法慢在需要循环偶数除2,当N足够大的时候会比较耗时,我们从此处入手,思路一的第一步求所有奇数的和,那剩下的就是1-N之间的所有偶数了。例如:<

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值