题目:
定义函数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 + 7 = 21.
有题义知:
f(2)+f(4)+f(6)+…..f()=f(1)+f(2)+f(3)…..
当n为奇数时:
sum(n)=f(1)+f(2)+f(3)+f(4)+……+f(n)=f(1)+f(3)+f(5)+…+f(n)+f(2)+f(4)+…f(n- 1)=(1+n)(n+1)/2/2+f(1)+f(2)+..f(n-1/2) = (1+n)(n+1)/2/2+sum((n-1)/2)
当n为偶数时:
sum(n)=f(1)+f(3)+f(5)+…+f(n-1)+f(2)+f(4)+…f(n)=(n-1+1)n/2/2+f(1)+f(2)+f(n/2)=n*n/4+sum(n/2);
1 #include<iostream>
2 using namespace std;
3 long long sum(long long n) {
4 if (n == 1) {
5 return 1;
6 }
7 if (n % 2 == 0) {
8 return sum(n / 2) + n * n / 4;
9 }
10 else {
11 return sum(n - 1) + n; //或者(1+n)(n+1)/2/2+sum((n-1)/2)
//奇数等偶数加1个奇数
12 }
13 }
14 int main() {
15 long long N;
16 cin >> N;
17 cout << sum(N) << endl;
18 }
复制代码
1 #include<iostream>
2 using namespace std;
3 long long sum(long long n) {
4 long long result = 0;
5 while (n > 0) {
6 if (n % 2 == 0) {
7 result += n * n / 4;
8 n /= 2;
9 }
10 else {
11 result += n; //result +=(1+n)*(n+1)/4;
//n=(n-1)/2;
12 n--;
13 }
14 }
15 return result;
16 }
17 int main() {
18 long long N;
19 cin >> N;
20 cout << sum(N) << endl;
21 }
复制代码