📜  打印给定数组中的前K个不同的Moran数

📅  最后修改于: 2021-05-06 19:47:51             🧑  作者: Mango

给定一个由N个不同的正整数组成的数组arr [] ,任务是打印给定数组中的前K个不同的Moran数。

例子:

方法:请按照以下步骤解决问题:

  1. 对数组排序
  2. 遍历排序后的数组,并为每个元素检查它是否为Moran数
  3. 如果确定为true,则将元素插入Set中并递增计数器,直到达到K为止。
  4. 集合的大小等于K时,打印集合中的元素。

下面是上述方法的实现:

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 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::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 s = new SortedSet();
  
    // 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


输出:
42, 45, 63, 198,



时间复杂度: O(N 3/2 )
辅助空间: O(N)