📜  几乎素数

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

k-几乎素数是具有恰好k个素因数的数字(不一定是互斥的)。

例如

2、3、5、7、11…(实际上所有素数)都是1-几乎素数,因为它们只有1个素数(本身就是素数)。

4、6、9…。是几乎2个质数,因为它们恰好具有2个质数(4 = 2 * 2、6 = 2 * 3、9 = 3 * 3)

同样,32是5个几乎有质数的数字(32 = 2 * 2 * 2 * 2 * 2),72也是如此(2 * 2 * 2 * 3 * 3)

所有几乎1-的素数都称为素数,而所有几乎2-的素数都称为半素数。
任务是打印前n个以k为素数的数字。
例子:

Input: k = 2, n = 5
Output: 4 6 9 10 14
4 has two prime factors, 2 x 2
6 has two prime factors, 2 x 3
Similarly, 9(3 x 3), 10(2 x 5) and 14(2 x 7)

Input: k = 10, n = 2
Output: 1024 1536
1024 and 1536 are first two numbers with 10
prime factors.

我们迭代自然数并继续打印k-素数,直到打印的k-素数的计数小于或等于n。为了检查数字是否为k-素数,我们找到素数因子的计数,如果计数为k,我们将数字视为k-素数。
下面是上述方法的实现:

C++
// Program to print first n numbers that are k-primes
#include
using namespace std;
 
// A function to count all prime factors of a given number
int countPrimeFactors(int n)
{
    int count = 0;
 
    // Count the number of 2s that divide n
    while (n%2 == 0)
    {
        n = n/2;
        count++;
    }
 
    // n must be odd at this point. So we can skip one
    // element (Note i = i +2)
    for (int i = 3; i <= sqrt(n); i = i+2)
    {
        // While i divides n, count i and divide n
        while (n%i == 0)
        {
            n = n/i;
            count++;
        }
    }
 
    // This condition is to handle the case whien n is a
    // prime number greater than 2
    if (n > 2)
        count++;
 
    return(count);
}
 
// A function to print the first n numbers that are
// k-almost primes.
void printKAlmostPrimes(int k, int n)
{
    for (int i=1, num=2; i<=n; num++)
    {
        // Print this number if it is k-prime
        if (countPrimeFactors(num) == k)
        {
            printf("%d ", num);
 
            // Increment count of k-primes printed
            // so far
            i++;
        }
    }
    return;
}
 
/* Driver program to test above function */
int main()
{
    int n = 10, k = 2;
    printf("First %d %d-almost prime numbers : \n",
           n, k);
    printKAlmostPrimes(k, n);
    return 0;
}


Java
// Program to print first n numbers that
// are k-primes
 
import java.io.*;
 
class GFG {
     
    // A function to count all prime factors
    // of a given number
    static int countPrimeFactors(int n)
    {
 
        int count = 0;
 
        // Count the number of 2s that divide n
        while (n % 2 == 0) {
 
            n = n / 2;
            count++;
        }
 
        // n must be odd at this point. So we
        // can skip one element (Note i = i +2)
        for (int i = 3; i <= Math.sqrt(n);
                                  i = i + 2) {
 
            // While i divides n, count i and
            // divide n
            while (n % i == 0) {
 
                n = n / i;
                count++;
            }
        }
 
        // This condition is to handle the case
        // whien n is a prime number greater
        // than 2
        if (n > 2)
            count++;
 
        return (count);
    }
 
    // A function to print the first n numbers
    // that are k-almost primes.
    static void printKAlmostPrimes(int k, int n)
    {
 
        for (int i = 1, num = 2; i <= n; num++) {
             
            // Print this number if it is k-prime
            if (countPrimeFactors(num) == k) {
                 
                System.out.print(num + " ");
 
                // Increment count of k-primes
                // printed so far
                i++;
            }
        }
 
        return;
    }
 
    /* Driver program to test above function */
    public static void main(String[] args)
    {
        int n = 10, k = 2;
        System.out.println("First " + n + " "
             + k + "-almost prime numbers : ");
 
        printKAlmostPrimes(k, n);
    }
}
 
// This code is contributed by vt_m.


Python3
# Python3 Program to print first
# n numbers that are k-primes
import math
 
# A function to count all prime
# factors of a given number
def countPrimeFactors(n):
    count = 0;
 
    # Count the number of
    # 2s that divide n
    while(n % 2 == 0):
        n = n / 2;
        count += 1;
 
    # n must be odd at this point.
    # So we can skip one
    # element (Note i = i +2)
    i = 3;
    while(i <= math.sqrt(n)):
         
        # While i divides n,
        # count i and divide n
        while (n % i == 0):
            n = n / i;
            count += 1;
        i = i + 2;
 
    # This condition is to handle
    # the case whien n is a
    # prime number greater than 2
    if (n > 2):
        count += 1;
 
    return(count);
 
# A function to print the
# first n numbers that are
# k-almost primes.
def printKAlmostPrimes(k, n):
    i = 1;
    num = 2
    while(i <= n):
         
        # Print this number if
        # it is k-prime
        if (countPrimeFactors(num) == k):
            print(num, end = "");
            print(" ", end = "");
 
            # Increment count of
            # k-primes printed
            # so far
            i += 1;
        num += 1;
    return;
 
# Driver Code
n = 10;
k = 2;
print("First n k-almost prime numbers:");
printKAlmostPrimes(k, n);
 
# This code is contributed by mits


C#
// C# Program to print first n
// numbers that are k-primes
using System;
 
class GFG
{
     
    // A function to count all prime 
    // factors of a given number
    static int countPrimeFactors(int n)
    {
        int count = 0;
 
        // Count the number of 2s that divide n
        while (n % 2 == 0)
        {
            n = n / 2;
            count++;
        }
 
        // n must be odd at this point. So we
        // can skip one element (Note i = i +2)
        for (int i = 3; i <= Math.Sqrt(n);
                                i = i + 2)
        {
 
            // While i divides n, count i and
            // divide n
            while (n % i == 0)
            {
                n = n / i;
                count++;
            }
        }
 
        // This condition is to handle
        // the case when n is a prime
        // number greater than 2
        if (n > 2)
            count++;
 
        return (count);
    }
 
    // A function to print the first n
    // numbers that are k-almost primes.
    static void printKAlmostPrimes(int k, int n)
    {
 
        for (int i = 1, num = 2; i <= n; num++)
        {
             
            // Print this number if it is k-prime
            if (countPrimeFactors(num) == k)
            {
                   Console.Write(num + " ");
 
                // Increment count of k-primes
                // printed so far
                i++;
            }
        }
 
        return;
    }
 
    // Driver code
    public static void Main()
    {
        int n = 10, k = 2;
        Console.WriteLine("First " + n + " "
            + k + "-almost prime numbers : ");
 
        printKAlmostPrimes(k, n);
    }
}
 
// This code is contributed by Nitin Mittal.


PHP
 2)
        $count++;
 
    return($count);
}
 
// A function to print the
// first n numbers that are
// k-almost primes.
function printKAlmostPrimes($k, $n)
{
    for ($i = 1, $num = 2; $i <= $n; $num++)
    {
         
        // Print this number if
        // it is k-prime
        if (countPrimeFactors($num) == $k)
        {
            echo($num);
            echo(" ");
 
            // Increment count of
            // k-primes printed
            // so far
            $i++;
        }
    }
    return;
}
 
    // Driver Code
    $n = 10;
    $k = 2;
    echo "First $n $k-almost prime numbers:\n";
    printKAlmostPrimes($k, $n);
 
// This code is contributed by nitin mittal.
?>


Javascript


输出
First 10 2-almost prime numbers : 
4 6 9 10 14 15 21 22 25 26 

参考: https : //en.wikipedia.org/wiki/Almost_prime