/**
* 收集质数因子
*/privatestaticList<Long>getPrimes(Long num){List<Long> res =newArrayList<>();// Math.sqrt(num)两数相乘最大的也就是平方,再往后就是重复值了double sqrt =Math.sqrt(num);for(long i =2L; i <= sqrt; i++){while(num % i ==0){
res.add(i);
num = num / i;}}// num==1说明全部整除开了,num!=1说明余下本身为素数if(num !=1){
res.add(num);}return res;}
判断是否为素数之积
/**
* 判断是否为素数之积
*/privatestaticList<Integer>getIntegers(int num){List<Integer> res =newArrayList<>();double sqrt =Math.sqrt(num);// 讨巧算法,两个数相乘最大的也就是平方for(int i =2; i <= sqrt; i++){// 求素数之积,要跳过1的特殊场景,所以从2开始查找if(!isPrime(i)){continue;// 第一个因数不为素数则处理下个数}if(num % i !=0){continue;// 不能整除则处理下个数}if(!isPrime(num / i)){continue;// 第二个因数不为素数则处理下个数}
res.add(i);
res.add(num / i);}return res;}
判断是不是素数
/**
* 判断是不是素数
*/publicstaticbooleanisPrime(int num){// 2,3if(num <4){return num >1;}double sqrt =Math.sqrt(num);for(int i =2; i <= sqrt; i++){if(num % i ==0){// 模为0说明整除了returnfalse;}}returntrue;}/**
* 有点高级需要理解,先保存
*/publicbooleanisPrime(int num){for(int i =2; i * i <= num; i++){if(num % i ==0){// 模为0说明整除了returnfalse;}}returntrue;}
i 和 i+1
NC61 两数之和
privatestaticint[]getIntegers(int[] numbers,int target){int[] res =newint[2];for(int i =0; i < numbers.length; i++){if(numbers[i]> target){continue;}// 这种判断存在的场景时不存在回头路的,有回头也是前面收集过的,所以j=i+1for(int j = i +1; j < numbers.length; j++){if(numbers[i]+ numbers[j]== target){
res[0]= i +1;
res[1]= j +1;return res;}}}return res;}