📌  相关文章
📜  每个元素的数字总和为合成数的最长子序列的长度

📅  最后修改于: 2021-05-14 00:59:23             🧑  作者: Mango

给定一个由非负整数组成的数组arr [] ,任务是打印给定数组中最长子序列的长度,该数组的每个元素的位数之和是一个复合数字。

例子:

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

  • 遍历给定的数组。
  • 对于每个数组元素,检查其数字之和是否为素数或其数字之和等于1
  • 如果其数字的总和为质数,则转到下一个数组元素。否则,将所需子序列的长度增加1
  • 最后,在遍历数组后,打印获得的子序列的长度。

下面是上述方法的实现:

C++
// C++ implenetation of the
// above approach
 
#include 
using namespace std;
 
#define N 100005
 
// Function to generate prime numbers
// using Sieve of Eratosthenes
void SieveOfEratosthenes(bool prime[],
                         int p_size)
{
    // Set 0 and 1 as non-prime
    prime[0] = false;
    prime[1] = false;
 
    for (int p = 2; p * p <= p_size; p++) {
 
        // If p is a prime
        if (prime[p]) {
 
            // Set all multiples of p as non-prime
            for (int i = p * 2; i <= p_size; i += p)
                prime[i] = false;
        }
    }
}
 
// Function to find the digit sum
// of a given number
int digitSum(int number)
{
    // Stores the sum of digits
    int sum = 0;
    while (number > 0) {
 
        // Extract digits and
        // add to the sum
        sum += (number % 10);
        number /= 10;
    }
 
    // Return the sum
    // of the digits
    return sum;
}
 
// Function to find the longest subsequence
// with sum of digits of each element equal
// to a composite number
void longestCompositeDigitSumSubsequence(
    int arr[], int n)
{
    int count = 0;
    bool prime[N + 1];
    memset(prime, true, sizeof(prime));
 
    SieveOfEratosthenes(prime, N);
 
    for (int i = 0; i < n; i++) {
 
        // Calculate sum of digits
        // of current array element
        int res = digitSum(arr[i]);
 
        // If sum of digits
        // equal to 1
        if (res == 1) {
            continue;
        }
 
        // If sum of digits is
        // a prime
        if (!prime[res]) {
            count++;
        }
    }
    cout << count << endl;
}
 
// Driver Code
int main()
{
 
    int arr[] = { 13, 55, 7, 3, 5, 1,
                  10, 21, 233, 144, 89 };
    int n = sizeof(arr)
            / sizeof(arr[0]);
 
    // Function call
    longestCompositeDigitSumSubsequence(
        arr, n);
 
    return 0;
}


Java
// Java implenetation of the
// above approach
import java.util.*;
 
class GFG{
 
static int N = 100005;
 
// Function to generate prime numbers
// using Sieve of Eratosthenes
static void SieveOfEratosthenes(boolean []prime,
                                int p_size)
{
     
    // Set 0 and 1 as non-prime
    prime[0] = false;
    prime[1] = false;
 
    for(int p = 2; p * p <= p_size; p++)
    {
         
        // If p is a prime
        if (prime[p])
        {
             
            // Set all multiples of p as non-prime
            for(int i = p * 2; i <= p_size; i += p)
                prime[i] = false;
        }
    }
}
 
// Function to find the digit sum
// of a given number
static int digitSum(int number)
{
     
    // Stores the sum of digits
    int sum = 0;
    while (number > 0)
    {
         
        // Extract digits and
        // add to the sum
        sum += (number % 10);
        number /= 10;
    }
 
    // Return the sum
    // of the digits
    return sum;
}
 
// Function to find the longest subsequence
// with sum of digits of each element equal
// to a composite number
static void longestCompositeDigitSumSubsequence(int []arr,
                                                int n)
{
    int count = 0;
    boolean []prime = new boolean[N + 1];
    for(int i = 0; i <= N; i++)
        prime[i] = true;
 
    SieveOfEratosthenes(prime, N);
 
    for(int i = 0; i < n; i++)
    {
         
        // Calculate sum of digits
        // of current array element
        int res = digitSum(arr[i]);
 
        // If sum of digits
        // equal to 1
        if (res == 1)
        {
            continue;
        }
 
        // If sum of digits is
        // a prime
        if (prime[res] == false)
        {
            count++;
        }
    }
    System.out.println(count);
}
 
// Driver Code
public static void main(String[] args)
{
    int []arr = { 13, 55, 7, 3, 5, 1,
                  10, 21, 233, 144, 89 };
    int n = arr.length;
 
    // Function call
    longestCompositeDigitSumSubsequence(arr, n);
}
}
 
// This code is contributed by Stream_Cipher


Python3
# Python3 implenetation of the
# above approach
N = 100005
 
# Function to generate prime numbers
# using Sieve of Eratosthenes
def SieveOfEratosthenes(prime,
                        p_size):
 
    # Set 0 and 1 as non-prime
    prime[0] = False
    prime[1] = False
 
    p = 2
    while p * p <= p_size:
 
        # If p is a prime
        if (prime[p]):
 
            # Set all multiples of
            # p as non-prime
            for i in range(p * 2,
                           p_size + 1, p):
                prime[i] = False
        p += 1
 
# Function to find
# the digit sum of
# a given number
def digitSum(number):
   
    # Stores the sum
    # of digits
    sum = 0
    while (number > 0):
 
        # Extract digits and
        # add to the sum
        sum += (number % 10)
        number //= 10
   
    # Return the sum
    # of the digits
    return sum
 
# Function to find the longest subsequence
# with sum of digits of each element equal
# to a composite number
def longestCompositeDigitSumSubsequence(arr, n):
 
    count = 0
    prime = [True] * (N + 1)
    SieveOfEratosthenes(prime, N)
 
    for i in range(n):
 
        # Calculate sum of digits
        # of current array element
        res = digitSum(arr[i])
 
        # If sum of digits
        # equal to 1
        if (res == 1):
            continue
       
        # If sum of digits is
        # a prime
        if (not prime[res]):
            count += 1
      
    print (count)
 
# Driver Code
if __name__ == "__main__":
 
    arr = [13, 55, 7, 3, 5, 1,
           10, 21, 233, 144, 89]
    n = len(arr)
 
    # Function call
    longestCompositeDigitSumSubsequence(arr, n)
 
# This code is contributed by Chitranayal


C#
// C# implenetation of the
// above approach
using System.Collections.Generic;
using System;
 
class GFG{
 
static int N = 100005;
 
// Function to generate prime numbers
// using Sieve of Eratosthenes
static void SieveOfEratosthenes(bool []prime,
                                int p_size)
{
     
    // Set 0 and 1 as non-prime
    prime[0] = false;
    prime[1] = false;
 
    for(int p = 2; p * p <= p_size; p++)
    {
 
        // If p is a prime
        if (prime[p])
        {
 
            // Set all multiples of p as non-prime
            for(int i = p * 2; i <= p_size; i += p)
                prime[i] = false;
        }
    }
}
 
// Function to find the digit sum
// of a given number
static int digitSum(int number)
{
     
    // Stores the sum of digits
    int sum = 0;
    while (number > 0)
    {
         
        // Extract digits and
        // add to the sum
        sum += (number % 10);
        number /= 10;
    }
 
    // Return the sum
    // of the digits
    return sum;
}
 
// Function to find the longest subsequence
// with sum of digits of each element equal
// to a composite number
static void longestCompositeDigitSumSubsequence(int []arr,
                                                int n)
{
    int count = 0;
    bool []prime = new bool[N + 1];
    for(int i = 0; i <= N; i++)
        prime[i] = true;
 
    SieveOfEratosthenes(prime, N);
 
    for(int i = 0; i < n; i++)
    {
         
        // Calculate sum of digits
        // of current array element
        int res = digitSum(arr[i]);
 
        // If sum of digits
        // equal to 1
        if (res == 1)
        {
            continue;
        }
 
        // If sum of digits is
        // a prime
        if (prime[res] == false)
        {
            count++;
        }
    }
    Console.WriteLine(count);
}
 
// Driver Code
public static void Main()
{
    int []arr = { 13, 55, 7, 3, 5, 1,
                  10, 21, 233, 144, 89 };
    int n = arr.Length;
 
    // Function call
    longestCompositeDigitSumSubsequence(arr, n);
}
}
 
// This code is contributed by Stream_Cipher


输出:
4





时间复杂度:O(N)
辅助空间: O(log 10 (maxm)),其中maxm是maxm数组元素