当前位置: 代码迷 >> 综合 >> 网易2017秋招编程题:最大奇约束 [python]
  详细解决方案

网易2017秋招编程题:最大奇约束 [python]

热度:66   发布时间:2023-10-11 13:48:12.0
'''
[编程题] 最大的奇约数
时间限制:1秒
空间限制:32768K
小易是一个数论爱好者,并且对于一个数的奇数约数十分感兴趣。一天小易遇到这样一个问题: 
定义函数f(x)为x最大的奇数约数,x为正整数。 例如:f(44) = 11.
现在给出一个N,需要求出 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
小易计算这个问题遇到了困难,需要你来设计一个算法帮助他。 
输入描述:
输入一个整数N (1 ≤ N ≤ 1000000000)




输出描述:
输出一个整数,即为f(1) + f(2) + f(3).......f(N)


输入例子1:
7


输出例子1:
21
'''



'''
解题思路:找规律
  一开始我很天真地老老实实用问题描述中的方法算,结果当然是超时超到妈都不认识了。后来静下心来仔细找了找规律才做出来
  我首先写出了前30个数的奇约数,并观察,发现它们似乎所有的数字都是按着1,3,5,7,9...这规律排列的
  仔细一想,便得出了如下规律:
  1~N的数字都可以看成是1,2,4,8...2^log(2,N)的奇数倍数的有序组合
  如              1         2           3           4           5           6          7           8            9
  可看出  1的1倍   2的1个  1的3倍  4的1倍   1的5倍   2的3倍 1的7倍    8的1倍   1的9倍
  找打这个规律后用计算机语言实现,可以把复杂度从O(N),下降到O(logN)
'''


'''
代码运行结果:
答案正确:恭喜!您提交的程序通过了所有的测试用例

'''


import math
N = int(input())
max_dig = int(math.log(N, 2))
sum_ = 0
for i in range(max_dig+1):temp = N//(2**i)if temp % 2:sum_ +=(1+temp)**2//4else:sum_ += temp**2//4print(sum_)


  相关解决方案