1. 程式人生 > >牛客網線上程式設計(20):最大奇約數-python

牛客網線上程式設計(20):最大奇約數-python

題目描述

小易是一個數論愛好者,並且對於一個數的奇數約數十分感興趣。一天小易遇到這樣一個問題: 定義函式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的奇約數的和,這時候又可以將奇數和偶數分開考慮了,一直遞迴下去就可了。注:本題暴力的解決是通不過測試的,複雜度太高。