蓝桥杯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);
    }
}
相关推荐
在所不辞兄3 小时前
为什么PINN非常适合求解有限元模型
人工智能·深度学习·神经网络·算法·机器学习
小蜗牛狂飙记3 小时前
java环境一键配置和切换的ui工具
java
逆光的July3 小时前
可靠消息投递与消费的工程设计:Outbox、幂等、死信兜底
java
一棵树73513 小时前
数据结构闲聊
数据结构·算法
bro_Java6663 小时前
《二叉树的基础知识、操作方法与代码示例》
java·数据结构·算法·广度优先
PascalXie3 小时前
地面机器人VSLAM技术调研与实现方案参考:算法、硬件平台与工程落地
算法·机器人
dishugj3 小时前
HANA集群计划内切换与维护操作
java·linux·数据库
yuniko-n3 小时前
【JUC】线程间通信
java·开发语言
yuniko-n3 小时前
【JUC】关于 Java 线程介绍
java·开发语言
HelloWorld工程师3 小时前
@Primary 注解
java·spring