前言
经过前期的基础训练以及部分实战练习,粗略掌握了各种题型的解题思路。现阶段开始专项练习。
数论包含最大公约数(>=2个数)、最大公约数性质、最小公倍数、区间范围质因素计数(最下间隔)、质因素分解、判断质数、平方根、立方根、互质、同余等等。
描述
给你一个整数
num
,请你找出同时满足下面全部要求的两个整数:
- 两数乘积等于
num + 1
或num + 2
- 以绝对差进行度量,两数大小最接近
你可以按任意顺序返回这两个整数。
示例 1:
输入:num = 8 输出:[3,3] 解释:对于 num + 1 = 9,最接近的两个因数是 3 & 3;对于 num + 2 = 10, 最接近的两个因数是 2 & 5,因此返回 3 & 3 。示例 2:
输入:num = 123 输出:[5,25]示例 3:
输入:num = 999 输出:[40,25]提示:
1 <= num <= 10^9
实现原理与步骤
1.定义题目需要的返回结果数据记录为全局变量。
2.分割num+1的因素,在[sqrt(num+1),1]中分别查找最大的因素,剩余的的因素在[sqrt(num+1),num+1]中则为最小,此时两数距离最短。
3.同理再分割num+2进行比较。
实现代码
class Solution {
int[] res=new int[2];
public int[] closestDivisors(int num) {
res[0]=0;
res[1]=Integer.MAX_VALUE;
divide(num+1);
divide(num+2);
return res;
}
public void divide(int num){
for(int i=(int)Math.sqrt(num);i>0;i--){
if(num%i==0){
if(Math.abs(num/i-i)<Math.abs(res[1]-res[0])){
res[1]=i;
res[0]=num/i;
break;
}
}
}
}
}