📌  相关文章
📜  求出最小正整数,这样它可以被A整除并且其位数之和等于B

📅  最后修改于: 2021-04-22 06:57:55             🧑  作者: Mango

给定两个整数AB ,任务是找到最小的正整数N ,以使N可被A整除,并且N的位数之和等于B。如果找不到数字,则打印-1

例子:

方法:

  • 创建将AB的值以及输出数字作为字符串存储的空队列q ,并创建存储访问数字的整数类型2-D数组Visited [] []
  • 将Node插入队列,然后检查队列是否为非空。
  • 当队列为非空时,请从队列中弹出一个元素,并从19的每个数字弹出,将数字连接在字符串num之后,并检查形成的数字是否为所需的数字。
  • 如果找到所需的号码,请打印该号码。
  • 否则,在数字小于B且队列为非空时(将未访问的数字推入队列),重复执行步骤。

下面是上述方法的实现:

C++
// C++ implementation of the approach
#include 
using namespace std;
  
// Array that stores visited digits
int visited[501][5001];
  
// Structure for queue Node.
struct Node {
    int a, b;
    string str;
};
  
// Function to return the minimum number such that it is
// divisible by 'a' and sum of its digits is equals to 'b'
int findNumber(int a, int b)
{
    // Create queue
    queue q;
  
    // Initially queue is empty
    Node temp = Node{ 0, 0, "" };
  
    // Initialize visited to 1
    visited[0][0] = 1;
  
    // Push temp in queue
    q.push(temp);
  
    // While queue is not empty
    while (!q.empty()) {
  
        // Get the front of the queue and pop it
        Node u = q.front();
        q.pop();
  
        // If popped element is the required number
        if (u.a == 0 && u.b == b)
  
            // Parse int from string and return it
            return std::stoi(u.str);
  
        // Loop for each digit and check the sum 
        // If not visited then push it to the queue
        for (int i = 0; i < 10; i++) {
            int dd = (u.a * 10 + i) % a;
            int ss = u.b + i;
            if (ss <= b && !visited[dd][ss]) {
                visited[dd][ss] = 1;
                q.push(Node{ dd, ss, u.str + char('0' + i) });
            }
        }
    }
  
    // Required number not found return -1.
    return -1;
}
  
// Driver code.
int main()
{
    int a = 25, b = 1;
    cout << findNumber(a, b);
    return 0;
}


Java
// Java implementation of the approach
import java.util.*;
class Solution
{
   
// Array that stores visited digits
static int visited[][]= new int[501][5001];
   
// Structure for queue Node.
static class Node {
    int a, b;
    String str;
    Node(int a1,int b1,String s)
    {
        a=a1;
        b=b1;
        str=s;
    }
}
   
// Function to return the minimum number such that it is
// divisible by 'a' and sum of its digits is equals to 'b'
static int findNumber(int a, int b)
{
    // Create queue
    Queue q= new LinkedList();
   
    // Initially queue is empty
    Node temp =new  Node( 0, 0, "" );
   
    // Initialize visited to 1
    visited[0][0] = 1;
   
    // Push temp in queue
    q.add(temp);
   
    // While queue is not empty
    while (q.size()!=0) {
   
        // Get the front of the queue and pop it
        Node u = q.peek();
        q.remove();
   
        // If popped element is the required number
        if (u.a == 0 && u.b == b)
   
            // Parse int from string and return it
            return Integer.parseInt(u.str);
   
        // Loop for each digit and check the sum 
        // If not visited then push it to the queue
        for (int i = 0; i < 10; i++) {
            int dd = (u.a * 10 + i) % a;
            int ss = u.b + i;
            if (ss <= b && visited[dd][ss]==0) {
                visited[dd][ss] = 1;
                q.add(new Node( dd, ss, u.str + (char)('0' + i) ));
            }
        }
    }
   
    // Required number not found return -1.
    return -1;
}
   
// Driver code.
public static void  main(String args[])
{
    //initilize visited
    for(int i=0;i<500;i++)
        for(int j=0;j<500;j++)
            visited[i][j]=0;
      
    int a = 25, b = 1;
    System.out.println(findNumber(a, b));
      
}
}
//contributed by Arnab Kundu


Python3
# Python3 implementation of the approach 
  
# Array that stores visited digits 
visited = [[0 for x in range(501)] 
              for y in range(5001)] 
  
# Structure for queue Node. 
class Node:
      
    def __init__(self, a, b, string):
        self.a = a
        self.b = b
        self.string = string
  
# Function to return the minimum number 
# such that it is divisible by 'a' and
# sum of its digits is equals to 'b' 
def findNumber(a, b): 
  
    # Use list as queue 
    q = []
  
    # Initially queue is empty 
    temp = Node(0, 0, "") 
  
    # Initialize visited to 1 
    visited[0][0] = 1
  
    # Push temp in queue 
    q.append(temp) 
  
    # While queue is not empty 
    while len(q) > 0: 
  
        # Get the front of the queue 
        # and pop it 
        u = q.pop(0) 
  
        # If popped element is the 
        # required number 
        if u.a == 0 and u.b == b: 
  
            # Parse int from string 
            # and return it 
            return int(u.string) 
  
        # Loop for each digit and check the sum 
        # If not visited then push it to the queue 
        for i in range(0, 10): 
            dd = (u.a * 10 + i) % a 
            ss = u.b + i 
              
            if ss <= b and visited[dd][ss] == False: 
                visited[dd][ss] = 1
                q.append(Node(dd, ss, u.string + str(i))) 
  
    # Required number not found return -1. 
    return -1
  
# Driver code. 
if __name__ == "__main__":
  
    a, b = 25, 1
    print(findNumber(a, b))
      
# This code is contributed by Rituraj Jain


输出:
100