C ++中最接近的除数

假设我们有一个整数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

    范例(C ++)

    让我们看下面的实现以更好地理解-

    #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]