1 条题解

  • 1
    @ 2025-9-13 14:51:41

    C

    说明

    本题要求找出数组中所有数对(包括i=j的情况)的最小公倍数(LCM)的最大值。核心思路如下:

    1. 最小公倍数的计算依赖最大公约数(GCD),公式为:LCM(a,b) = (a×b) / GCD(a,b)(需确保a×b不溢出)
    2. 遍历数组中所有可能的数对(a_i, a_j),计算每对的LCM
    3. 跟踪并更新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++非标准头文件(竞赛常用),包含所有标准库,无需手动逐个包含,适合快速编码。

    新知识

    1. 标准库函数:

      • 术语:std::gcd(来自库,C++17及以上支持)
      • 解释:C++标准库提供的求最大公约数的函数,可直接使用,无需手动实现欧几里得算法。
      • 对比:C语言需手动实现GCD函数;C++可直接调用标准库,减少代码量。
    2. 最大值更新:

      • 术语: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
    上传者