Print first K distinct Moran numbers from a given array

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++

filter_none

edit
close

play_arrow

link
brightness_4
code

#include <algorithm>
#include <iostream>
#include <set>
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;
}

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

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<Integer> s = new TreeSet<Integer>();
  
    // 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

chevron_right


Python3

filter_none

edit
close

play_arrow

link
brightness_4
code

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

chevron_right


C#

filter_none

edit
close

play_arrow

link
brightness_4
code

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

chevron_right


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.




My Personal Notes arrow_drop_up

Check out this Author's contributed articles.

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.



Improved By : akhilsaini