Find the minimum positive integer such that it is divisible by A and sum of its digits is equal to B

• Difficulty Level : Hard
• Last Updated : 10 Aug, 2021

Given two integers A and B, the task is to find the minimum positive integer N such that N is divisible by A and the sum of the digits of N is equal to B. If number is not found then print -1.
Examples:

Input: A = 20, B = 30
Output: 49980
49980 is divisible by 20 and sum of its digit = 4 + 9 + 9 + 8 + 0 = 30
Input: A = 5, B = 2
Output: 20

Approach:

• Create empty queue q that stores the value of A and B and output number as a string and create integer type 2-D array visited[][] that stores the visited digit.
• Insert Node into queue and check if queue is non-empty.
• While the queue is non-empty, pop an element from the queue and for every digit from 1 to 9, concatenate the digit after the string num and check whether the number formed is the required number.
• If the required number is found, print the number.
• Else repeat the steps while the number is less than B and the queue is non-empty while pushing the non-visited number to the queue.

Below is the implementation of the above approach:

C++

 // C++ implementation of the approach#include using namespace std; // Array that stores visited digitsint visited; // 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 = 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 approachimport java.util.*;class Solution{  // Array that stores visited digitsstatic int visited[][]= new int;  // 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 = 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[]){    //initialize 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 digitsvisited = [[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 = 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

Javascript


Output:
100

Time Complexity: O(N)
Auxiliary Space: O(N)

My Personal Notes arrow_drop_up