蓝桥杯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);
    }
}
相关推荐
JOEH602 小时前
为什么你的接口总是响应慢?Java 生产环境 6 大排查误区
java
linux修理工2 小时前
Claude API 密钥更换方法
java·数据库·mysql
clamlss2 小时前
💥 踩坑实录:MapStruct 映射失效?揭秘 Lombok 组合下的编译期陷阱
java·后端
殷紫川2 小时前
CAS 无锁并发深度解析:从 CPU 原语、JDK 源码到生产实战与避坑指南
java
chase。2 小时前
【学习笔记】从经典算法到通用神经运动规划器
笔记·学习·算法
2301_810154552 小时前
CVE-2019-6341 漏洞复现
java·开发语言
Roselind_Yi2 小时前
【吴恩达2026 Agentic AI】面试向+项目实战(含面试题+项目案例)-4
人工智能·面试·职场和发展·实时互动·跳槽·社交电子·学习方法
SimonKing2 小时前
IDEA 2026.1重磅发布:AI智能体全面开放,编程进入“万能插座”时代
java·后端·程序员
chushiyunen2 小时前
langchain的流式事件监听astream_event()、todo运行机制
java·数据库·langchain