牛客12579题详解:递归算法求解最大奇约数和 | 数学与算法完美结合
一、问题理解与算法思路
题目要求计算1到N所有数的最大奇约数的和。最大奇约数是指一个数最大的奇数约数,例如:
6的最大奇约数是3
8的最大奇约数是1
9的最大奇约数是9本身
解题关键思路:
奇数的最大奇约数是其本身
偶数的最大奇约数等于其一半的最大奇约数
使用递归将问题分解为奇数部分和偶数部分
二、完整代码实现(带详细注释)
#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到N/2的和
边界条件:N小于1时返回0
四、复杂度分析与优化
五、常见问题解答
Q:为什么奇数部分的和是平方数? A:因为1+3+5+...+(2n-1) = n²,这是等差数列的性质。
Q:如何处理大数溢出问题? A:代码中使用了long long类型,可以处理较大的N值。
Q:递归终止条件是什么? A:当N小于1时递归终止,返回0。
原创内容 转载请注明出处