最大奇约数-递归

题目:

定义函数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 }
复制代码
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值