📌  相关文章
📜  仅使用 D 形成的可被 K 整除的数字的最小长度

📅  最后修改于: 2022-05-13 01:56:10.004000             🧑  作者: Mango

仅使用 D 形成的可被 K 整除的数字的最小长度

给定 2 个整数DK,任务是找到由重复D形成的可被K整除的数字的最小长度。如果不存在这样的数字,则打印-1

例子:

天真的方法:想法是不断形成数字,直到它可以被K整除或超出范围。

时间复杂度: O(10^18)
辅助空间: O(1)

有效方法:这个想法是存储通过将数字除以K并将余数存储在数组中而产生的余数。而当同样的余数再次出现时,可以断定不存在这样的数。请按照以下步骤解决问题:

  • 将变量cnt初始化为0以存储答案,将变量m初始化为存储数字。
  • 初始化大小为K的向量v[]以存储余数并将v[m]的值设置为1。
  • 在while循环中迭代并执行以下步骤
    • 如果m等于0,则返回cnt的值作为答案。
    • m的值设置为(((m * (10 % k)) % k) + (d % k)) % k。
    • 如果v[m]等于1,则返回-1 ,因为不可能有这样的数字。
    • v[m]的值设置为1 ,并将cnt的值增加1。
  • 执行上述步骤后,返回值-1。

下面是上述方法的实现:

C++
// C++ program for the above approach
#include 
using namespace std;
 
// Function to form the smallest number
// possible
int smallest(int k, int d)
{
    int cnt = 1;
    int m = d % k;
 
    // Array to mark the remainders
    // counted already
    vector v(k, 0);
    v[m] = 1;
 
    // Iterate over the range
    while (1) {
        if (m == 0)
            return cnt;
        m = (((m * (10 % k)) % k) + (d % k)) % k;
 
        // If that remainder is already found,
        // return -1
        if (v[m] == 1)
            return -1;
        v[m] = 1;
        cnt++;
    }
    return -1;
}
 
// Driver Code
int main()
{
 
    int d = 1;
    int k = 41;
    cout << smallest(k, d);
    return 0;
}


Java
// Java program for the above approach
import java.util.*;
 
class GFG{
 
// Function to form the smallest number
// possible
static int smallest(int k, int d)
{
    int cnt = 1;
    int m = d % k;
 
    // Array to mark the remainders
    // counted already
    int[] v = new int[k];
    Arrays.fill(v, 0);
    v[m] = 1;
 
    // Iterate over the range
    while (1 != 0)
    {
        if (m == 0)
            return cnt;
             
        m = (((m * (10 % k)) % k) + (d % k)) % k;
 
        // If that remainder is already found,
        // return -1
        if (v[m] == 1)
            return -1;
             
        v[m] = 1;
        cnt++;
    }
}
 
// Driver Code
public static void main(String[] args)
{
    int d = 1;
    int k = 41;
     
    System.out.println(smallest(k, d));
}
}
 
// This code is contributed by sanjoy_62


Python3
# Python program for the above approach;
 
# Function to form the smallest number
# possible
def smallest(k, d):
    cnt = 1
    m = d % k
 
    # Array to mark the remainders
    # counted already
    v = [0 for i in range(k)];
    v[m] = 1
 
    # Iterate over the range
    while (1):
        if (m == 0):
            return cnt
        m = (((m * (10 % k)) % k) + (d % k)) % k
 
        # If that remainder is already found,
        # return -1
        if (v[m] == 1):
            return -1
        v[m] = 1
        cnt += 1
 
    return -1
 
# Driver Code
d = 1
k = 41
print(smallest(k, d))
 
# This code is contributed by gfgking


C#
// C# program for the above approach
using System;
using System.Collections.Generic;
 
class GFG{
 
// Function to form the smallest number
// possible
static int smallest(int k, int d)
{
    int cnt = 1;
    int m = d % k;
 
    // Array to mark the remainders
    // counted already
    int [] v = new int[k];
    for(int i=0;i


Javascript


输出
5

时间复杂度: O(K)
辅助空间: O(K)