案例训练1.25:细节总结

今天都在写练习题,总结几个容易忽略的点。

一.等差数列

输入一个值,代表接下来输入的等差数列有几个项

输入每个项(不按顺序,随便输),输出能覆盖所有项的最少等差数列

import java.util.Arrays;
import java.util.Scanner;

public class 等差数列 {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();
        long[]arr=new long[n];
        for(int i=0;i<n;i++){
            arr[i]=sc.nextLong();
        }
        Arrays.sort(arr);
        long[]c=new long[n-1];
        for(int i=0;i<c.length;i++){
            c[i]=arr[i+1]-arr[i];
        }
        Arrays.sort(c);
        long temp=gcd1(c[0],c[c.length-1]);
        long result=(arr[arr.length-1]-arr[0])/temp+1;
        System.out.println(result);
 }
    public static  long gcd1(long a,long b){//求最大公约数
        long temp=Math.max(a,b);
        long count=Math.min(a,b);
        return count==0?temp:gcd1(count,temp%count);//递归
    }
}

1.除了上方的Scanner输入,也可以用快读readline()和split直接放到String数组里,再用Integer的方法转化成int类型,如果像我上面的代码这样写思路会更顺。

2.由于创建了多个数组,建议在数组旁边你注释作用不然会容易搞混

3.这道等差数列如何确定“差”是最重要的,我的方法是用各项之间最小的差和最大的差取最大公约数。

二.质数因子

求一个数由多少个素数(质数)相乘得来

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;

public class 质数约数 {
    public static void main(String[] args) throws IOException {
        BufferedReader in=new BufferedReader(new InputStreamReader(System.in));
        Long n=Long.parseLong(in.readLine());
        long count=0;
        ArrayList<Long> list=new ArrayList<>();
        if(pandaun(n)){
            System.out.println(1);
            return;
        }
    for(long i=2;i<n/i;i++){
        if(n % i == 0) {
                list.add(i);
            while (n % i == 0) {
                    n = n / i;
                    if (pandaun(n)) {
                        list.add(n);
                        for (int j = 0; j < list.size(); j++) {
                            if (list.get(j) != 0) {
                                count++;
                            }
                        }
                        System.out.println(count);
                        return;
                    }
               
            }
        }
        //
    }
    }

    public  static boolean pandaun(Long i){//判断是不是素数
        boolean flag=true;
        for (int j=2;j<i/j;j++){
            if (i%j==0){
                flag=false;
                break;
            }
        }
        return flag;
    }
}

1.了解int(-2^31“ 到”2^31 -1)、long(-2^64“ 到”2^64 -1)的最大范围是多少,以免写题时设置的类型不符合要求

2.判断素数里,包括上面的求因数,由于两个因数肯定是一大一小或者都等于根号n,所以for循环的范围只用到n/i

3.判断素数中,当有一个数可以取余时循环就可以结束了,所以在if后面加break,减少程序运行负担

4.根据”某数的因数的因数就是某数的因数“,在上面判断素数并加入数组时,可以把n/i,让n=n/i进行下一个循环不仅减少运行负担,而且不影响结果(因为唯一分解定理,余数肯定也是由素数组成,余数的素数就是原来数的素数

最重要!!!

5.用while(n%10==0循环可以用一个数多次除和余,比如说我用2除了多次,那么我轮到4除的时候肯定会跳过了,因为4是2的倍数。又因为每个数都是由素数相乘得的,所以从2开始判断n%i==0在n=n/i循环,则后面每个非素数(i)要除n时实际上都被前面比自己小的素数除过了(因为每个数都是由多个素数相乘),因为由while循环在,进入下一个for循环非素数根本不可能while循环(想一下2、3都是质数就好理解了,前面都已经除过了)所以不用纠结于判断一开始i是否为素数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值