牛客網線上程式設計(20):最大奇約數-python
阿新 • • 發佈:2018-12-20
題目描述
小易是一個數論愛好者,並且對於一個數的奇數約數十分感興趣。一天小易遇到這樣一個問題: 定義函式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
輸出
21
程式碼實現
n=int(input())
result=0
while n:
result+=(n-n//2)**2
n//=2
print(str(result))
原理說明
我們將奇數和偶數分開考慮,如果一個數是奇數那麼它的最大奇約數就是本身,這些奇數的和就是(n-n//2)**2,在考慮偶數的最大奇約數,我們可以將所有的偶數除以2,這時候這些偶數的奇約數和就變成了前n//2的奇約數的和,這時候又可以將奇數和偶數分開考慮了,一直遞迴下去就可了。注:本題暴力的解決是通不過測試的,複雜度太高。