参考:https://www.nowcoder.com/questionTerminal/49cb3d0b28954deca7565b8db92c5296?toCommentId=289608
题目描述
小易是一个数论爱好者,并且对于一个数的奇数约数十分感兴趣。一天小易遇到这样一个问题: 定义函数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,需要求出 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)
#include
<bits/stdc++.h>
using
namespace
std
;
int
main
()
{
long
long
N;
long
long
count
=
0
;
cin
>>
N;
for
(
long
long
i
=
N;i
>
0
;i
=
i
/
2
)
count
+=
((i
+
1
)
/
2
)
*
((i
+
1
)
/
2
);
cout
<<
count
<<
endl;
system
(
"pause"
);
return
0
;
}
//例如N为8则:
//1 2 3 4 5 6 7 8 中有,1 3 5 7 四个奇数相加然后对2 4 6 8
//分别除于二得1 2 3 4中有1 3两个奇数相加,然后对2 4分别除于二,以此类推
//当n为偶数时,有n/2个奇数,根据等差数列求和公式,
//((1+n-1)*n/2)/2,即为(n/2)*(n/2),此时n为偶数,因此(n/2)*(n/2)=((n+1)/2)*((n+1)/2)
//当n为奇数时,有(n+1)/2个奇数,奇数和为(n+1)/2*(n+1)/2