1 条题解

  • 0
    @ 2024-4-23 17:44:36
    #include <stdio.h>
    
    int gcd(int a,int b)
    {
        int c=1,max,min;
        max=(a>b)?a:b;
        min=(a>b)?b:a;
        while (c!=0)
        {
            c=max%min;
            max=min;
            min=c;
        }
        return max;
    }
    
    
    
    int main()
    {
        int len,i;
        scanf("%d",&len);
        //定义并输入数组长度:len
        //定义循环变量:i
        int org[len],left[len-1],right[len-1],gcds[len];
        for(i=1;i<=len;i++)scanf("%d",&org[i-1]);
        /*
        定义并输入一个数组储存原始值:org[len]
        定义两个数组储存从左与从右遍历的最大公约数值:left[len]与right[len]
        定义一个数组储存len次忽略某位数的最大公约数:gcds[len]
        */
        int result;
        //定义最终结果变量result
        left[0]=org[0];
        for(i=2;i<=len-1;i++)left[i-1]=gcd(left[i-2],org[i-1]);
        //计算left[len-1]
        right[0]=org[len-1];
        for(i=2;i<=len-1;i++)right[i-1]=gcd(right[i-2],org[len-i]);
        //计算right[len-1]
        gcds[0]=right[len-2];
        gcds[len-1]=left[len-2];
        for(i=2;i<=len-1;i++)gcds[i-1]=gcd(left[i-2],right[len-i-1]);
        //进行左右归并,求出gcds[len]
        result=gcds[0];
        for(i=1;i<=len;i++)result=(gcds[i-1]>result)?gcds[i-1]:result;
        printf("%d",result);
        return 0;
    }
    //
    
    • 1

    信息

    ID
    972
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    536
    已通过
    19
    上传者