2026-01-23:奇数和与偶数和的最大公约数。用go语言,给定一个整数 n,记 A 为前 n 项奇数序列(1、3、5、…)的
【摘要】 2026-01-23:奇数和与偶数和的最大公约数。用go语言,给定一个整数 n,记 A 为前 n 项奇数序列(1、3、5、…)的和,B 为前 n 项偶数序列(2、4、6、…)的和。要求返回 A 与 B 的最大公约数。1 <= n <= 1000。输入: n = 5。输出: 5。解释:前 5 个奇数的总和 sumOdd = 1 + 3 + 5 + 7 + 9 = 25。前 5 个偶数的总和 s...
2026-01-23:奇数和与偶数和的最大公约数。用go语言,给定一个整数 n,记 A 为前 n 项奇数序列(1、3、5、…)的和,B 为前 n 项偶数序列(2、4、6、…)的和。要求返回 A 与 B 的最大公约数。
1 <= n <= 1000。
输入: n = 5。
输出: 5。
解释:
前 5 个奇数的总和 sumOdd = 1 + 3 + 5 + 7 + 9 = 25。
前 5 个偶数的总和 sumEven = 2 + 4 + 6 + 8 + 10 = 30。
因此,GCD(sumOdd, sumEven) = GCD(25, 30) = 5。
题目来自力扣3658。
🧮 计算奇数和与偶数和
首先,你需要分别计算前n个奇数的和(A)与前n个偶数的和(B)。
-
计算奇数和 (A):
- 奇数的序列是:1, 3, 5, …, 第n项。这是一个首项为1,公差为2的等差数列。
- 等差数列的求和公式为:( S = \frac{n}{2} \times (首项 + 末项) )。
- 第n个奇数的值可以用公式 ( 2n-1 ) 表示。
- 因此,前n个奇数的和 ( A = \frac{n}{2} \times (1 + (2n-1)) = \frac{n}{2} \times 2n = n^2 ) 。
-
计算偶数和 (B):
- 偶数的序列是:2, 4, 6, …, 第n项。这是一个首项为2,公差为2的等差数列。
- 第n个偶数的值可以用公式 ( 2n ) 表示。
- 因此,前n个偶数的和 ( B = \frac{n}{2} \times (2 + 2n) = \frac{n}{2} \times 2(n+1) = n(n+1) ) 。
通过数学公式,你可以直接计算出A和B的值,而无需通过循环逐个累加,这非常高效。
📐 计算最大公约数(GCD)
在得到奇数和 ( A = n^2 ) 和偶数和 ( B = n(n+1) ) 之后,下一步是计算这两个数的最大公约数。
- 理解数值关系:( A = n^2 ),( B = n(n+1) )。
- 寻找GCD:两个数A和B的最大公约数,是能同时整除A和B的最大正整数。由于A和B都含有公因子 ( n ),所以它们的GCD至少是 ( n ) 乘以 ( n ) 和 ( n+1 ) 的GCD,即 ( GCD(A, B) = n \times GCD(n, n+1) )。
- 利用数学性质:连续的两个整数 ( n ) 和 ( n+1 ) 是互质的(它们的最大公约数是1),因为任何大于1的整数都无法同时整除两个连续的整数 。
- 得出结论:因此,( GCD(A, B) = n \times GCD(n, n+1) = n \times 1 = n )。
所以,最终答案就是输入的整数 ( n ) 本身。
⏱️ 复杂度分析
- 时间复杂度:O(1)。整个计算过程只涉及几次基本的算术运算(乘法、减法)和一次GCD计算(在这个特定问题中,GCD计算也简化为O(1))。无论n的值多大,计算步骤都是固定的,因此时间复杂度是常数阶。
- 空间复杂度:O(1)。算法只使用了固定数量的变量(如存储n、A、B等),没有使用随输入规模n增长的额外数据结构,因此空间复杂度也是常数阶。
💎 总结
解决这个问题的关键在于利用等差数列的求和公式快速计算出奇数和与偶数和,并认识到两个和之间的数学关系(都含有因子n,且n和n+1互质),从而直接得出最大公约数就是n本身。这使得算法非常高效,时间和空间复杂度都是常数。
Go完整代码如下:
package main
import (
"fmt"
)
func gcdOfOddEvenSums(n int) int {
return n
}
func main() {
n := 5
result := gcdOfOddEvenSums(n)
fmt.Println(result)
}

Python完整代码如下:
# -*-coding:utf-8-*-
def gcd_of_odd_even_sums(n: int) -> int:
return n
def main() -> None:
n = 5
result = gcd_of_odd_even_sums(n)
print(result)
if __name__ == "__main__":
main()

C++完整代码如下:
#include <iostream>
using namespace std;
int gcdOfOddEvenSums(int n) {
return n;
}
int main() {
int n = 5;
int result = gcdOfOddEvenSums(n);
cout << result << endl;
return 0;
}

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)