📌  相关文章
📜  求出最小值x使得(x%k)*(x / k)== n |套装2

📅  最后修改于: 2021-04-26 06:47:43             🧑  作者: Mango

给定两个正整数n和k。找到最小正整数x,使(x%k)*(x / k)== n,其中%是模运算符,/是整数除法运算符。
例子:

方法:使用Set-1中的K值解决了问题。在本文中,我们将使用因子方法来解决上述问题。下面给出解决上述问题的步骤。

  • 由于方程的形式为a * b = N,因此a和b将是N的因数。
  • 从1迭代到sqrt(N)以获取所有因子。
  • 因子i和n / i可以是A或B。
    1. 如果i为A而n / i为B,则数字将为i * k +(n / i) 。我们可以通过将其与N进行比较来检查该数字是否为1,如果是,则该数字满足方程式。
    2. 如果i是B并且n / i是A,则数字将是(n / i)* k +(i) 。我们可以通过将其与N进行比较来检查该数字是否为1,如果是,则该数字满足方程式。
  • 获得所有满足方程式的数字,并打印出其中最小的数字。

下面是上述方法的实现。

C++
// CPP Program to find the minimum
// positive X such that the given
// equation holds true
#include 
using namespace std;
 
// This function gives the required
// answer
int minimumX(int n, int k)
{
    int mini = INT_MAX;
 
    // Iterate for all the factors
    for (int i = 1; i * i <= n; i++) {
 
        // Check if i is a factor
        if (n % i == 0) {
            int fir = i;
            int sec = n / i;
            int num1 = fir * k + sec;
 
            // Consider i to be A and n/i to be B
            int res = (num1 / k) * (num1 % k);
            if (res == n)
                mini = min(num1, mini);
 
            int num2 = sec * k + fir;
            res = (num2 / k) * (num2 % k);
 
            // Consider i to be B and n/i to be A
            if (res == n)
                mini = min(num2, mini);
        }
    }
    return mini;
}
 
// Driver Code to test above function
int main()
{
    int n = 4, k = 6;
    cout << minimumX(n, k) << endl;
 
    n = 5, k = 5;
    cout << minimumX(n, k) << endl;
    return 0;
}


Java
// Java Program to find the minimum
// positive X such that the given
// equation holds true
import java.util.*;
 
class solution
{
 
// This function gives the required
// answer
static int minimumX(int n, int k)
{
    int mini = Integer.MAX_VALUE;
 
    // Iterate for all the factors
    for (int i = 1; i * i <= n; i++) {
 
        // Check if i is a factor
        if (n % i == 0) {
            int fir = i;
            int sec = n / i;
            int num1 = fir * k + sec;
 
            // Consider i to be A and n/i to be B
            int res = (num1 / k) * (num1 % k);
            if (res == n)
                mini = Math.min(num1, mini);
 
            int num2 = sec * k + fir;
            res = (num2 / k) * (num2 % k);
 
            // Consider i to be B and n/i to be A
            if (res == n)
                mini = Math.min(num2, mini);
        }
    }
    return mini;
}
 
// Driver Code to test above function
public static void main(String args[])
{
    int n = 4, k = 6;
    System.out.println(minimumX(n, k));
 
    n = 5;
    k = 5;
    System.out.println(minimumX(n, k));
}
}


Python3
# Python3 program to find the minimum
# positive X such that the given
# equation holds true
import sys
 
# This function gives the required
# answer
def minimumX(n, k):
 
    mini = sys.maxsize
 
    # Iterate for all the factors
    i = 1
    while i * i <= n :
 
        # Check if i is a factor
        if (n % i == 0) :
            fir = i
            sec = n // i
            num1 = fir * k + sec
 
            # Consider i to be A and n/i to be B
            res = (num1 // k) * (num1 % k)
            if (res == n):
                mini = min(num1, mini)
 
            num2 = sec * k + fir
            res = (num2 // k) * (num2 % k)
 
            # Consider i to be B and n/i to be A
            if (res == n):
                mini = min(num2, mini)
 
        i += 1
 
    return mini
 
# Driver Code
if __name__ == "__main__":
 
    n = 4
    k = 6
    print (minimumX(n, k))
 
    n = 5
    k = 5
    print (minimumX(n, k))
 
# This code is contributed by ita_c


C#
// C# Program to find the minimum
// positive X such that the given
// equation holds true
 
using System;
 
class solution
{
 
// This function gives the required
// answer
static int minimumX(int n, int k)
{
    int mini = int.MaxValue;
 
    // Iterate for all the factors
    for (int i = 1; i * i <= n; i++) {
 
        // Check if i is a factor
        if (n % i == 0) {
            int fir = i;
            int sec = n / i;
            int num1 = fir * k + sec;
 
            // Consider i to be A and n/i to be B
            int res = (num1 / k) * (num1 % k);
            if (res == n)
                mini = Math.Min(num1, mini);
 
            int num2 = sec * k + fir;
            res = (num2 / k) * (num2 % k);
 
            // Consider i to be B and n/i to be A
            if (res == n)
                mini = Math.Min(num2, mini);
        }
    }
    return mini;
}
 
// Driver Code to test above function
public static void Main()
{
    int n = 4, k = 6;
    Console.WriteLine(minimumX(n, k));
 
    n = 5;
    k = 5;
    Console.WriteLine(minimumX(n, k));
}
// This code is contributed by Ryuga
}


PHP


Javascript


输出:
10
26

时间复杂度: O(sqrt(N)),其中N是给定的正整数。