当前位置:首页 > 牛客题解 > 牛客12579题详解:递归算法求解最大奇约数和 | 数学与算法完美结合

牛客12579题详解:递归算法求解最大奇约数和 | 数学与算法完美结合

9小时前牛客题解21

截图未命名.jpg 牛客12579题详解:递归算法求解最大奇约数和 | 数学与算法完美结合 最大奇约数 递归算法 数学问题 牛客12579 等差数列求和 第1张

一、问题理解与算法思路

题目要求计算1到N所有数的最大奇约数的和。最大奇约数是指一个数最大的奇数约数,例如:

  • 6的最大奇约数是3

  • 8的最大奇约数是1

  • 9的最大奇约数是9本身

解题关键思路

  1. 奇数的最大奇约数是其本身

  2. 偶数的最大奇约数等于其一半的最大奇约数

  3. 使用递归将问题分解为奇数部分和偶数部分

二、完整代码实现(带详细注释)

#include <iostream>
using namespACe std;

// 递归计算1~N的最大奇约数和
long long calculateSum(int N) {
    if(N < 1) return 0;  // 边界条件处理
    
    // 计算奇数部分和:(1+3+5+...+N) 等差数列求和
    long long odd_cnt = (N + 1) / 2;
    long long odd_sum = odd_cnt * odd_cnt;
    
    // 计算偶数部分和:等价于1~N/2的和
    return odd_sum + calculateSum(N / 2);
}

int main() {
    int N;
    while(cin >> N) {  // 处理多组输入
        if(N <= 0) {   // 特殊输入处理
            cout << 0 << endl;
            continue;
        }
        cout << calculateSum(N) << endl;
    }
    return 0;
}

三、算法核心解析

  1. 递归思想:将问题分解为奇数部分和偶数部分

  2. 奇数处理:直接使用等差数列求和公式

  3. 偶数处理:等价于求1到N/2的和

  4. 边界条件:N小于1时返回0

四、复杂度分析与优化

  1. 时间复杂度:O(logN),每次递归N减半

  2. 空间复杂度:O(logN),递归调用的深度

  3. 优化建议

    • 可以改为迭代实现减少栈空间

    • 对于大数可以使用记忆化优化

五、常见问题解答

Q:为什么奇数部分的和是平方数? A:因为1+3+5+...+(2n-1) = n²,这是等差数列的性质。

Q:如何处理大数溢出问题? A:代码中使用了long long类型,可以处理较大的N值。

Q:递归终止条件是什么? A:当N小于1时递归终止,返回0。


原创内容 转载请注明出处

分享给朋友:

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。