给定一个由N个不同的正整数组成的数组arr [] ,任务是打印给定数组中的前K个不同的Moran数。
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
例子:
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
方法:请按照以下步骤解决问题:
- 对数组排序
- 遍历排序后的数组,并检查每个元素是否为Moran数
- 如果确定为true,则将元素插入Set中并递增计数器,直到达到K为止。
- 当集合的大小等于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)