2017校招-最大的奇約數
小易是一個數論愛好者,並且對於一個數的奇數約數十分感興趣。一天小易遇到這樣一個問題: 定義函數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
#include<iostream>
using namespace std;
int main()
{
int n;
cin >> n;
long long res = 0;
int mici = 1;
long long temp = ((n/mici)+1)/2;
while(temp)
{
res += temp*temp;
mici *= 2;
temp = ((n/mici)+1)/2;
}
cout << res;
}