今天都在写练习题,总结几个容易忽略的点。
一.等差数列
输入一个值,代表接下来输入的等差数列有几个项
输入每个项(不按顺序,随便输),输出能覆盖所有项的最少等差数列
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是否为素数