Related Articles

# Print first K distinct Moran numbers from a given array

• Last Updated : 17 May, 2021

Given an array arr[] consisting of N distinct positive integers, the task is to print the first K distinct Moran Numbers from the given array.

A number N is a Moran number if N divided by the sum of its digits gives a prime number
Examples: 18, 21, 27, 42, 45

Examples:

Input: arr[] = {192, 21, 18, 138, 27, 42, 45}, K = 4
Output: 21, 27, 42, 45
Explanation:

• The sum of digits of the integer 21 is 2 + 1 = 3. Therefore, dividing 21 by its sum of digits = 21 / 3 = 7, which is a prime number.
• The sum of digits of the integer 27 is 2 + 7 = 9. Therefore, dividing 27 by its sum of digits results in 27 / 9 = 3, which is a prime number.
• The sum of digits of the integer 42 is 4 + 2 = 6. Therefore, dividing 42 by its sum of digits results in 42 / 6 = 7, which is a prime number.
• The sum of digits of the integer 45 is 4 + 5 = 9. Therefore, dividing 45 by its sum of digits results in 45 / 9 = 5, which is a prime number.

Input: arr[]={127, 186, 198, 63, 27, 91}, K = 3
Output: 27, 63, 198

Approach: Follow the steps given below to solve the problem:

1. Sort the array
2. Traverse the sorted array and for each element, check if it is a Moran number or not
3. If found to be true, insert the element in a Set and increment the counter until it reaches K.
4. Print the elements in the Set when the size of the set is equal to K.

Below is the implementation of the above approach:

## C++

 `#include ``#include ``#include ``using` `namespace` `std;` `// Function to calculate the``// sum of digits of a number``int` `digiSum(``int` `a)``{``    ``// Stores the sum of digits``    ``int` `sum = 0;``    ``while` `(a) {` `        ``// Add the digit to sum``        ``sum += a % 10;` `        ``// Remove digit``        ``a = a / 10;``    ``}` `    ``// Returns the sum``    ``// of digits``    ``return` `sum;``}` `// Function to check if a number``// is prime or not``bool` `isPrime(``int` `r)``{``    ``bool` `s = ``true``;` `    ``for` `(``int` `i = 2; i * i <= r; i++) {` `        ``// If r has any divisor``        ``if` `(r % i == 0) {` `            ``// Set r as non-prime``            ``s = ``false``;``            ``break``;``        ``}``    ``}``    ``return` `s;``}` `// Function to check if a``// number is moran number``bool` `isMorannumber(``int` `n)``{``    ``int` `dup = n;` `    ``// Calculate sum of digits``    ``int` `sum = digiSum(dup);` `    ``// Check if n is divisible``    ``// by the sum of digits``    ``if` `(n % sum == 0) {` `        ``// Calculate the quotient``        ``int` `c = n / sum;` `        ``// If the quotient is prime``        ``if` `(isPrime(c)) {` `            ``return` `true``;``        ``}``    ``}` `    ``return` `false``;``}` `// Function to print the first K``// Moran numbers from the array``void` `FirstKMorannumber(``int` `a[],``                       ``int` `n, ``int` `k)``{``    ``int` `X = k;` `    ``// Sort the given array``    ``sort(a, a + n);` `    ``// Initialise a set``    ``set<``int``> s;` `    ``// Traverse the array from the end``    ``for` `(``int` `i = n - 1; i >= 0``                        ``&& k > 0;``         ``i--) {``        ``// If the current array element``        ``// is a Moran number``        ``if` `(isMorannumber(a[i])) {` `            ``// Insert into the set``            ``s.insert(a[i]);``            ``k--;``        ``}``    ``}` `    ``if` `(k > 0) {``        ``cout << X << ``" Moran numbers are"``             ``<< ``" not present in the array"` `<< endl;``        ``return``;``    ``}` `    ``set<``int``>::iterator it;``    ``for` `(it = s.begin(); it != s.end(); ++it) {``        ``cout << *it << ``", "``;``    ``}``    ``cout << endl;``}` `// Driver Code``int` `main()``{` `    ``int` `A[] = { 34, 198, 21, 42,``                ``63, 45, 22, 44, 43 };``    ``int` `K = 4;` `    ``int` `N = ``sizeof``(A) / ``sizeof``(A[0]);` `    ``FirstKMorannumber(A, N, K);` `    ``return` `0;``}`

## Java

 `import` `java.io.*;``import` `java.util.*;` `class` `GFG{` `// Function to calculate the``// sum of digits of a number``static` `int` `digiSum(``int` `a)``{``    ` `    ``// Stores the sum of digits``    ``int` `sum = ``0``;``    ``while` `(a != ``0``)``    ``{``        ` `        ``// Add the digit to sum``        ``sum += a % ``10``;` `        ``// Remove digit``        ``a = a / ``10``;``    ``}` `    ``// Returns the sum``    ``// of digits``    ``return` `sum;``}` `// Function to check if a number``// is prime or not``static` `boolean` `isPrime(``int` `r)``{``    ``boolean` `s = ``true``;` `    ``for``(``int` `i = ``2``; i * i <= r; i++)``    ``{``        ` `        ``// If r has any divisor``        ``if` `(r % i == ``0``)``        ``{``            ` `            ``// Set r as non-prime``            ``s = ``false``;``            ``break``;``        ``}``    ``}``    ``return` `s;``}` `// Function to check if a``// number is moran number``static` `boolean` `isMorannumber(``int` `n)``{``    ``int` `dup = n;` `    ``// Calculate sum of digits``    ``int` `sum = digiSum(dup);` `    ``// Check if n is divisible``    ``// by the sum of digits``    ``if` `(n % sum == ``0``)``    ``{``        ` `        ``// Calculate the quotient``        ``int` `c = n / sum;` `        ``// If the quotient is prime``        ``if` `(isPrime(c))``        ``{``            ``return` `true``;``        ``}``    ``}``    ``return` `false``;``}` `// Function to print the first K``// Moran numbers from the array``static` `void` `FirstKMorannumber(``int``[] a,``                              ``int` `n, ``int` `k)``{``    ``int` `X = k;` `    ``// Sort the given array``    ``Arrays.sort(a);` `    ``// Initialise a set``    ``TreeSet s = ``new` `TreeSet();` `    ``// Traverse the array from the end``    ``for``(``int` `i = n - ``1``; i >= ``0` `&& k > ``0``; i--)``    ``{``        ` `        ``// If the current array element``        ``// is a Moran number``        ``if` `(isMorannumber(a[i]))``        ``{``            ` `            ``// Insert into the set``            ``s.add(a[i]);``            ``k--;``        ``}``    ``}` `    ``if` `(k > ``0``)``    ``{``        ``System.out.println(X + ``" Moran numbers are"` `+``                               ``" not present in the array"``);``        ``return``;``    ``}` `    ``for``(``int` `value : s)``        ``System.out.print(value + ``", "``);``        ` `    ``System.out.print(``"\n"``);``}` `// Driver Code``public` `static` `void` `main(String[] args)``{``    ``int``[] A = { ``34``, ``198``, ``21``, ``42``,``                ``63``, ``45``, ``22``, ``44``, ``43` `};``    ``int` `K = ``4``;` `    ``int` `N = A.length;` `    ``FirstKMorannumber(A, N, K);``}``}` `// This code is contributed by akhilsaini`

## Python3

 `import` `math` `# Function to calculate the``# sum of digits of a number``def` `digiSum(a):``    ` `    ``# Stores the sum of digits``    ``sums ``=` `0``    ``while` `(a !``=` `0``):``        ` `        ``# Add the digit to sum``        ``sums ``+``=` `a ``%` `10` `        ``# Remove digit``        ``a ``=` `a ``/``/` `10` `    ``# Returns the sum``    ``# of digits``    ``return` `sums` `# Function to check if a number``# is prime or not``def` `isPrime(r):``    ` `    ``s ``=` `True` `    ``for` `i ``in` `range``(``2``, ``int``(math.sqrt(r)) ``+` `1``):``        ` `        ``# If r has any divisor``        ``if` `(r ``%` `i ``=``=` `0``):` `            ``# Set r as non-prime``            ``s ``=` `False``            ``break` `    ``return` `s` `# Function to check if a``# number is moran number``def` `isMorannumber(n):``    ` `    ``dup ``=` `n` `    ``# Calculate sum of digits``    ``sums ``=` `digiSum(dup)` `    ``# Check if n is divisible``    ``# by the sum of digits``    ``if` `(n ``%` `sums ``=``=` `0``):``        ` `        ``# Calculate the quotient``        ``c ``=` `n ``/``/` `sums` `        ``# If the quotient is prime``        ``if` `isPrime(c):``            ``return` `True` `    ``return` `False` `# Function to print the first K``# Moran numbers from the array``def` `FirstKMorannumber(a, n, k):``    ` `    ``X ``=` `k` `    ``# Sort the given array``    ``a.sort()` `    ``# Initialise a set``    ``s ``=` `set``()` `    ``# Traverse the array from the end``    ``for` `i ``in` `range``(n ``-` `1``, ``-``1``, ``-``1``):``        ``if` `(k <``=` `0``):``            ``break` `        ``# If the current array element``        ``# is a Moran number``        ``if` `(isMorannumber(a[i])):``            ` `            ``# Insert into the set``            ``s.add(a[i])``            ``k ``-``=` `1` `    ``if` `(k > ``0``):``        ``print``(X, end ``=``' Moran numbers are not '``                       ``'present in the array'``)``        ``return` `    ``lists ``=` `sorted``(s)``    ``for` `i ``in` `lists:``        ``print``(i, end ``=` `', '``)` `# Driver Code``if` `__name__ ``=``=` `'__main__'``:` `    ``A ``=` `[ ``34``, ``198``, ``21``, ``42``,``          ``63``, ``45``, ``22``, ``44``, ``43` `]``    ``K ``=` `4` `    ``N ``=` `len``(A)` `    ``FirstKMorannumber(A, N, K)` `# This code is contributed by akhilsaini`

## C#

 `using` `System;``using` `System.Collections;``using` `System.Collections.Generic;` `class` `GFG{` `// Function to calculate the``// sum of digits of a number``static` `int` `digiSum(``int` `a)``{``    ` `    ``// Stores the sum of digits``    ``int` `sum = 0;``    ``while` `(a != 0)``    ``{``        ` `        ``// Add the digit to sum``        ``sum += a % 10;` `        ``// Remove digit``        ``a = a / 10;``    ``}` `    ``// Returns the sum``    ``// of digits``    ``return` `sum;``}` `// Function to check if a number``// is prime or not``static` `bool` `isPrime(``int` `r)``{``    ``bool` `s = ``true``;` `    ``for``(``int` `i = 2; i * i <= r; i++)``    ``{``        ` `        ``// If r has any divisor``        ``if` `(r % i == 0)``        ``{``            ` `            ``// Set r as non-prime``            ``s = ``false``;``            ``break``;``        ``}``    ``}``    ``return` `s;``}` `// Function to check if a``// number is moran number``static` `bool` `isMorannumber(``int` `n)``{``    ``int` `dup = n;``    ` `    ``// Calculate sum of digits``    ``int` `sum = digiSum(dup);` `    ``// Check if n is divisible``    ``// by the sum of digits``    ``if` `(n % sum == 0)``    ``{``        ` `        ``// Calculate the quotient``        ``int` `c = n / sum;` `        ``// If the quotient is prime``        ``if` `(isPrime(c))``        ``{``            ``return` `true``;``        ``}``    ``}``    ``return` `false``;``}` `// Function to print the first K``// Moran numbers from the array``static` `void` `FirstKMorannumber(``int``[] a,``                              ``int` `n, ``int` `k)``{``    ``int` `X = k;` `    ``// Sort the given array``    ``Array.Sort(a);` `    ``// Initialise a set``    ``SortedSet<``int``> s = ``new` `SortedSet<``int``>();` `    ``// Traverse the array from the end``    ``for``(``int` `i = n - 1; i >= 0 && k > 0; i--)``    ``{``        ` `        ``// If the current array element``        ``// is a Moran number``        ``if` `(isMorannumber(a[i]))``        ``{``            ` `            ``// Insert into the set``            ``s.Add(a[i]);``            ``k--;``        ``}``    ``}` `    ``if` `(k > 0)``    ``{``        ``Console.WriteLine(X + ``" Moran numbers are"` `+``                              ``" not present in the array"``);``        ``return``;``    ``}` `    ``foreach``(``var` `val ``in` `s)``    ``{``        ``Console.Write(val + ``", "``);``    ``}``    ``Console.Write(``"\n"``);``}` `// Driver Code``public` `static` `void` `Main()``{``    ``int``[] A = { 34, 198, 21, 42,``                ``63, 45, 22, 44, 43 };``    ``int` `K = 4;` `    ``int` `N = A.Length;` `    ``FirstKMorannumber(A, N, K);``}``}` `// This code is contributed by akhilsaini`

## Javascript

 ``

Output:
`42, 45, 63, 198,`

Time Complexity: O(N3/2)
Auxiliary Space: O(N)

Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the DSA Self Paced Course at a student-friendly price and become industry ready.  To complete your preparation from learning a language to DS Algo and many more,  please refer Complete Interview Preparation Course.

In case you wish to attend live classes with experts, please refer DSA Live Classes for Working Professionals and Competitive Programming Live for Students.

My Personal Notes arrow_drop_up