假设我们有一个整数num,我们必须找到其差等于num + 1或num + 2的绝对差值中最接近的两个整数。我们必须以任意顺序找到这两个整数。因此,如果输入为8,则输出将为[3,3],对于num + 1,它将为9,最接近的因数是3和3,对于num + 2 = 10,最接近的因数是2和5 ,因此选择了3和3。
为了解决这个问题,我们将遵循以下步骤-
定义一个名为getDiv()的方法,该方法将x作为输入
diff:= infinity,创建一个大小为2的ret数组
对于i:= 1,如果i ^ 2 <= x,则将i加1
一个:=我
b:= x / i
newDiff:= | a – b |
如果newDiff <diff,则
差异:= newDiff
ret [0]:= a和ret [1]:= b
如果x可被i整除,则
返回ret
从主要方法中找到op1:= getDiv(num + 1)和op2:= getDiv(num + 2)
当| op1 [0] – op [1] |时返回op1 <= | op2 [0] – op2 [1] |,否则为op2
让我们看下面的实现以更好地理解-
#include <bits/stdc++.h> using namespace std; void print_vector(vector<auto> v){ cout << "["; for(int i = 0; i<v.size(); i++){ cout << v[i] << ", "; } cout << "]"<<endl; } class Solution { public: vector <int> getDiv(int x){ int diff = INT_MAX; vector <int> ret(2); for(int i = 1; i * i <= x; i++){ if(x % i == 0){ int a = i; int b = x / i; int newDiff = abs(a - b); if(newDiff < diff){ diff = newDiff; ret[0] = a; ret[1] = b; } } } return ret; } vector<int> closestDivisors(int num) { vector <int> op1 = getDiv(num + 1); vector <int> op2 = getDiv(num + 2); return abs(op1[0] - op1[1]) <= abs(op2[0] - op2[1]) ? op1 : op2; } }; main(){ Solution ob; print_vector(ob.closestDivisors(8)); }
8
输出结果
[3,3]