蓝桥杯192.等差数列java

使得等差数列最短就是让已知的项数最大的作为末项,最小的作为首项,根据a1+(n-1)d=an可以知道我们需要找出最大的d即可,将已知的数列排序后的相邻两项的差为:差1=a*d,差2=b*d,差2=c*d,差3=e*d,差4=f*d(a,b,c,e,f...为正整数可以相等)。。。。所以d就是这些差的最大公约数,即可求出最短的项数

复制代码
import java.util.Scanner;
import java.util.Arrays;

// 类名必须为Main
public class Main {
    // 求两个数的最大公约数(辗转相除法)
    private static long gcd(long a, long b) {
        while (b != 0) {
            long temp = b;
            b = a % b;
            a = temp;
        }
        return a;
    }

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        long[] num = new long[n]; // 用long避免溢出(Ai可达1e9,差可达1e9,GCD计算安全)
        for (int i = 0; i < n; i++) {
            num[i] = in.nextLong();
        }
        Arrays.sort(num);

        // 特殊情况:所有元素都相同,直接输出n(最短就是n项,公差0)
        if (num[0] == num[n - 1]) {
            System.out.println(n);
            return;
        }

        // 计算所有相邻差的最大公约数,作为公差
        long d = 0;
        for (int i = 1; i < n; i++) {
            long diff = num[i] - num[i - 1];
            d = gcd(d, diff);
        }

        // 计算项数:(末项 - 首项) / 公差 + 1
        long ans = (num[n - 1] - num[0]) / d + 1;
        System.out.println(ans);
    }
}
相关推荐
wno70418 分钟前
Spring Security权限控制
java·python·spring
杨运交1 小时前
[071][验证码模块]基于Spring拦截器的验证码认证设计思想
java·后端·spring
Geek-Chow1 小时前
CountDownLatch in Java
java
漂流瓶jz1 小时前
UVA-1442 洞穴 题解答案代码 算法竞赛入门经典第二版
c++·算法·题解·aoapc·算法竞赛入门经典·uva
SL_staff2 小时前
从RBAC到场景化授权:《无忧·企业文档》三级权限模型的技术实践解析
java·开源·产品
传奇开心果编程2 小时前
【springboot基础语法学与练】第 1 课:从零开始
java·spring boot·后端·学习
SL_staff2 小时前
财务系统慎用低代码?从数据模型闭环看合规落地的技术实践
java·低代码·全栈
叠层归一研究院2 小时前
基于极限自指的叠层归一宇宙结构理论——无元外部封闭系统的内生区分模型
人工智能·经验分享·算法·agi
滕州市燕猫虎计算机科技工作室个体工商户3 小时前
IDEA:Command line is too long
java·ide·intellij-idea
步行cgn3 小时前
Spring p 命名空间注入详解
java·前端·spring