1 条题解
-
1
C
说明
本题要求找出数组中所有数对(包括i=j的情况)的最小公倍数(LCM)的最大值。核心思路如下:
- 最小公倍数的计算依赖最大公约数(GCD),公式为:LCM(a,b) = (a×b) / GCD(a,b)(需确保a×b不溢出)
- 遍历数组中所有可能的数对(a_i, a_j),计算每对的LCM
- 跟踪并更新LCM的最大值
由于数组长度n最大为500,数对总数为500×500=250,000,且每个数最大为500,计算量较小,时间复杂度为O(n²),完全可行。
代码
#include <stdio.h> // gcd写法1 int gcd1(int a,int b) { int r; while(b>0) { r=a%b; a=b; b=r; } return a; } // gcd写法2 int gcd2(int a,int b) { return b>0 ? gcd2(b,a%b):a; } // gcd位运算版 去C++试 // int gcd3(int a,int b) { // while(b^=a^=b^=a%=b); // return a; // } int lcm(int a,int b){ return a/gcd2(a,b)*b; // 先除再乘防溢出 } int main() { int n; scanf("%d", &n); int arr[510]; for (int i = 0; i < n; i++) scanf("%d", &arr[i]); int max_lcm = 0; // 遍历所有 i<j 的数对(避免重复计算) for (int i = 0; i < n; i++) { for (int j = i + 1; j < n; j++) { int current_lcm = lcm (arr [i], arr [j]); if (current_lcm > max_lcm) { max_lcm = current_lcm; } } } printf("%d\n", max_lcm); return 0; }C语言拓展知识
推荐搜索:欧几里得算法(辗转相除法)的原理、LCM与GCD的数学关系、整数乘法溢出的预防方法(如先除后乘)。
C++
说明
本题解法思路与C语言完全一致:通过计算所有数对的LCM找到最大值。C++实现时,可利用标准库函数简化代码,同时保持逻辑清晰。
万能头文件
#include<bits/stdc++.h> 是C++非标准头文件(竞赛常用),包含所有标准库,无需手动逐个包含,适合快速编码。
新知识
-
标准库函数:
- 术语:
std::gcd(来自库,C++17及以上支持) - 解释:C++标准库提供的求最大公约数的函数,可直接使用,无需手动实现欧几里得算法。
- 对比:C语言需手动实现GCD函数;C++可直接调用标准库,减少代码量。
- 术语:
-
最大值更新:
- 术语:
std::max(来自库) - 解释:用于比较两个值并返回较大值的函数,可简化最大值更新的逻辑。
- 对比:C语言需用if判断手动更新;C++用
max_lcm = max(max_lcm, current_lcm)一行代码即可完成。
- 术语:
AC
#include <bits/stdc++.h> using namespace std; int main() { ios::sync_with_stdio(false); cin.tie(0); int n; cin>>n; vector<int> arr(n); // 动态容器存储数组 for (int i = 0; i < n; i++) { cin >> arr[i]; } int max_lcm = 0; // 遍历所有数对(i,j) for (int i = 0; i < n; i++) { for (int j = i+1; j < n; j++) { int current_lcm = (arr[i] / gcd(arr[i], arr[j])) * arr[j]; // 调用标准库GCD函数并计算LCM max_lcm = max(max_lcm, current_lcm); // 用标准库max更新最大值 } } cout << max_lcm << endl; return 0; }C++拓展知识
推荐搜索:C++标准库中
std::gcd的使用条件(编译器版本要求)、std::max对不同数据类型的支持、vector容器与普通数组的性能对比。
- 1
信息
- ID
- 489
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 4
- 标签
- (无)
- 递交数
- 57
- 已通过
- 13
- 上传者