Find the minimum positive integer such that it is divisible by A and sum of its digits is equal to B
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 = 30Input: 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 <bits/stdc++.h> 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<Node> 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<Node> q= new LinkedList<Node>(); // 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[]) { //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 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 |
Javascript
<script> // Javascript implementation of the approach // Array that stores visited digits let visited= new Array(501); for (let i = 0; i < 501; i++) { visited[i] = new Array(5001); for (let j = 0; j < 5001; j++) visited[i][j] = 0; } // Structure for queue Node. class Node { constructor(a1, b1, s) { this .a = a1; this .b = b1; this .str = s; } } // Function to return the minimum number such that it is // divisible by 'a' and sum of its digits is equals to 'b' function findNumber(a,b) { // Create queue let q= []; // Initially queue is empty let temp = new 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.length != 0) { // Get the front of the queue and pop it let u = q[0]; q.shift(); // If popped element is the required number if (u.a == 0 && u.b == b) // Parse int from string and return it return parseInt(u.str); // Loop for each digit and check the sum // If not visited then push it to the queue for (let i = 0; i < 10; i++) { let dd = (u.a * 10 + i) % a; let ss = u.b + i; if (ss <= b && visited[dd][ss] == 0) { visited[dd][ss] = 1; q.push( new Node( dd, ss, u.str + String.fromCharCode( '0' .charCodeAt(0) + i) )); } } } // Required number not found return -1. return -1; } // Driver code. let a = 25, b = 1; document.write(findNumber(a, b)); // This code is contributed by avanitrachhadiya2155 </script> |
C#
using System; using System.Collections.Generic; // Structure for queue Node. struct Node { public int a, b; public string str; } class GFG { // Array that stores visited digits static int [,] visited = new int [501, 5001]; // 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<Node> q = new Queue<Node>(); // Initially queue is empty Node temp = new Node { a = 0, b = 0, str = "" }; // Initialize visited to 1 visited[0, 0] = 1; // Push temp in queue q.Enqueue(temp); // While queue is not empty while (q.Count != 0) { // Get the front of the queue and pop it Node u = q.Dequeue(); // If popped element is the required number if (u.a == 0 && u.b == b) { // Parse int from string and return it return Int32.Parse(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.Enqueue( new Node { a = dd, b = ss, str = u.str + Convert.ToChar( '0' + i) }); } } } // Required number not found return -1. return -1; } // Driver code. static void Main( string [] args) { int a = 25, b = 1; Console.WriteLine(findNumber(a, b)); } } |
Output
100
Complexity Analysis:
- Time Complexity: O(N)
- Auxiliary Space: O(N)
Please Login to comment...