Programa eficiente para imprimir el número de factores de n números

Dada una array de enteros. Estamos obligados a escribir un programa para imprimir el número de factores de cada elemento de la array dada.
Ejemplos: 
 

Input: 10 12 14 
Output: 4 6 4 
Explanation: There are 4 factors of 10 (1, 2, 
5, 10) and 6 of 12 and 4 of 14.

Input: 100 1000 10000
Output: 9 16 25 
Explanation: There are 9 factors of 100  and
16 of 1000 and 25 of 10000.

C++

// C++ program to count number of factors
// of an array of integers
#include <bits/stdc++.h>
using namespace std;
 
const int MAX = 1000001;
 
// array to store prime factors
int factor[MAX] = { 0 };
 
// function to generate all prime factors
// of numbers from 1 to 10^6
void generatePrimeFactors()
{
    factor[1] = 1;
 
    // Initializes all the positions with their value.
    for (int i = 2; i < MAX; i++)
        factor[i] = i;
 
    // Initializes all multiples of 2 with 2
    for (int i = 4; i < MAX; i += 2)
        factor[i] = 2;
 
    // A modified version of Sieve of Eratosthenes to
    // store the smallest prime factor that divides
    // every number.
    for (int i = 3; i * i < MAX; i++) {
        // check if it has no prime factor.
        if (factor[i] == i) {
            // Initializes of j starting from i*i
            for (int j = i * i; j < MAX; j += i) {
                // if it has no prime factor before, then
                // stores the smallest prime divisor
                if (factor[j] == j)
                    factor[j] = i;
            }
        }
    }
}
 
// function to calculate number of factors
int calculateNoOfFactors(int n)
{
    if (n == 1)
        return 1;
 
    int ans = 1;
 
    // stores the smallest prime number
    // that divides n
    int dup = factor[n];
 
    // stores the count of number of times
    // a prime number divides n.
    int c = 1;
 
    // reduces to the next number after prime
    // factorization of n
    int j = n / factor[n];
 
    // false when prime factorization is done
    while (j != 1) {
        // if the same prime number is dividing n,
        // then we increase the count
        if (factor[j] == dup)
            c += 1;
 
        /* if its a new prime factor that is factorizing n,
           then we again set c=1 and change dup to the new
           prime factor, and apply the formula explained
           above. */
        else {
            dup = factor[j];
            ans = ans * (c + 1);
            c = 1;
        }
 
        // prime factorizes a number
        j = j / factor[j];
    }
 
    // for the last prime factor
    ans = ans * (c + 1);
 
    return ans;
}
 
// Driver program to test above function
int main()
{
    // generate prime factors of number
    // upto 10^6
    generatePrimeFactors();
 
    int a[] = { 10, 30, 100, 450, 987 };
 
    int q = sizeof(a) / sizeof(a[0]);
 
    for (int i = 0; i < q; i++)
        cout << calculateNoOFactors(a[i]) << " ";
 
    return 0;
}

Java

// JAVA Code For Efficient program to print
// the number of factors of n numbers
import java.util.*;
 
class GFG {
 
    static int MAX = 1000001;
    static int factor[];
 
    // function to generate all prime
    // factors of numbers from 1 to 10^6
    static void generatePrimeFactors()
    {
        factor[1] = 1;
 
        // Initializes all the positions with
        // their value.
        for (int i = 2; i < MAX; i++)
            factor[i] = i;
 
        // Initializes all multiples of 2 with 2
        for (int i = 4; i < MAX; i += 2)
            factor[i] = 2;
 
        // A modified version of Sieve of
        // Eratosthenes to store the
        // smallest prime factor that
        // divides every number.
        for (int i = 3; i * i < MAX; i++) {
            // check if it has no prime factor.
            if (factor[i] == i) {
                // Initializes of j starting from i*i
                for (int j = i * i; j < MAX; j += i) {
                    // if it has no prime factor
                    // before, then stores the
                    // smallest prime divisor
                    if (factor[j] == j)
                        factor[j] = i;
                }
            }
        }
    }
 
    // function to calculate number of factors
    static int calculateNoOfFactors(int n)
    {
        if (n == 1)
            return 1;
 
        int ans = 1;
 
        // stores the smallest prime number
        // that divides n
        int dup = factor[n];
 
        // stores the count of number of times
        // a prime number divides n.
        int c = 1;
 
        // reduces to the next number after prime
        // factorization of n
        int j = n / factor[n];
 
        // false when prime factorization is done
        while (j != 1) {
            // if the same prime number is dividing n,
            // then we increase the count
            if (factor[j] == dup)
                c += 1;
 
            /* if its a new prime factor that is
               factorizing n, then we again set c=1
               and change dup to the new prime factor,
               and apply the formula explained
               above. */
            else {
                dup = factor[j];
                ans = ans * (c + 1);
                c = 1;
            }
 
            // prime factorizes a number
            j = j / factor[j];
        }
 
        // for the last prime factor
        ans = ans * (c + 1);
 
        return ans;
    }
 
    /* Driver program to test above function */
    public static void main(String[] args)
    {
        // array to store prime factors
        factor = new int[MAX];
        factor[0] = 0;
 
        // generate prime factors of number
        // upto 10^6
        generatePrimeFactors();
 
        int a[] = { 10, 30, 100, 450, 987 };
 
        int q = a.length;
 
        for (int i = 0; i < q; i++)
            System.out.print(calculateNoOFactors(a[i]) + " ");
    }
}
 
// This code is contributed by Arnav Kr. Mandal.

Python3

# Python3 program to count
# number of factors
# of an array of integers
MAX = 1000001;
 
# array to store
# prime factors
factor = [0]*(MAX + 1);
 
# function to generate all
# prime factors of numbers
# from 1 to 10^6
def generatePrimeFactors():
    factor[1] = 1;
 
    # Initializes all the
    # positions with their value.
    for i in range(2,MAX):
        factor[i] = i;
 
    # Initializes all
    # multiples of 2 with 2
    for i in range(4,MAX,2):
        factor[i] = 2;
 
    # A modified version of
    # Sieve of Eratosthenes
    # to store the smallest
    # prime factor that divides
    # every number.
    i = 3;
    while(i * i < MAX):
        # check if it has
        # no prime factor.
        if (factor[i] == i):
            # Initializes of j
            # starting from i*i
            j = i * i;
            while(j < MAX):
                # if it has no prime factor
                # before, then stores the
                # smallest prime divisor
                if (factor[j] == j):
                    factor[j] = i;
                j += i;
        i+=1;
 
# function to calculate
# number of factors
def calculateNoOfFactors(n):
    if (n == 1):
        return 1;
    ans = 1;
 
    # stores the smallest
    # prime number that
    # divides n
    dup = factor[n];
 
    # stores the count of
    # number of times a
    # prime number divides n.
    c = 1;
 
    # reduces to the next
    # number after prime
    # factorization of n
    j = int(n / factor[n]);
 
    # false when prime
    # factorization is done
    while (j > 1):
        # if the same prime
        # number is dividing
        # n, then we increase
        # the count
        if (factor[j] == dup):
            c += 1;
 
        # if its a new prime factor
        # that is factorizing n,
        # then we again set c=1 and
        # change dup to the new prime
        # factor, and apply the formula
        # explained above.
        else:
            dup = factor[j];
            ans = ans * (c + 1);
            c = 1;
 
        # prime factorizes
        # a number
        j = int(j / factor[j]);
 
    # for the last
    # prime factor
    ans = ans * (c + 1);
 
    return ans;
# Driver Code
 
if __name__ == "__main__":
     
     
# generate prime factors
# of number upto 10^6
    generatePrimeFactors()
    a = [10, 30, 100, 450, 987]
    q = len(a)
    for i in range (0,q):
        print(calculateNoOFactors(a[i]),end=" ")
 
# This code is contributed
# by mits.

C#

// C# program to count number of factors
// of an array of integers
using System;
 
class GFG {
 
    static int MAX = 1000001;
     
    // array to store prime factors
    static int[] factor;
 
    // function to generate all prime
    // factors of numbers from 1 to 10^6
    static void generatePrimeFactors()
    {
         
        factor[1] = 1;
 
        // Initializes all the positions
        // with their value.
        for (int i = 2; i < MAX; i++)
            factor[i] = i;
 
        // Initializes all multiples of
        // 2 with 2
        for (int i = 4; i < MAX; i += 2)
            factor[i] = 2;
 
        // A modified version of Sieve of
        // Eratosthenes to store the
        // smallest prime factor that
        // divides every number.
        for (int i = 3; i * i < MAX; i++)
        {
             
            // check if it has no prime
            // factor.
            if (factor[i] == i)
            {
                 
                // Initializes of j
                // starting from i*i
                for (int j = i * i;
                          j < MAX; j += i)
                {
                     
                    // if it has no prime
                    // factor before, then
                    // stores the smallest
                    // prime divisor
                    if (factor[j] == j)
                        factor[j] = i;
                }
            }
        }
    }
 
    // function to calculate number of
    // factors
    static int calculateNoOfFactors(int n)
    {
        if (n == 1)
            return 1;
 
        int ans = 1;
 
        // stores the smallest prime
        // number that divides n
        int dup = factor[n];
 
        // stores the count of number
        // of times a prime number
        // divides n.
        int c = 1;
 
        // reduces to the next number
        // after prime factorization
        // of n
        int j = n / factor[n];
 
        // false when prime factorization
        // is done
        while (j != 1) {
             
            // if the same prime number
            // is dividing n, then we
            // increase the count
            if (factor[j] == dup)
                c += 1;
 
            /* if its a new prime factor
            that is factorizing n, then
            we again set c=1 and change
            dup to the new prime factor,
            and apply the formula explained
            above. */
            else {
                dup = factor[j];
                ans = ans * (c + 1);
                c = 1;
            }
 
            // prime factorizes a number
            j = j / factor[j];
        }
 
        // for the last prime factor
        ans = ans * (c + 1);
 
        return ans;
    }
 
    /* Driver program to test above
    function */
    public static void Main()
    {
         
        // array to store prime factors
        factor = new int[MAX];
        factor[0] = 0;
 
        // generate prime factors of number
        // upto 10^6
        generatePrimeFactors();
 
        int[] a = { 10, 30, 100, 450, 987 };
 
        int q = a.Length;
 
        for (int i = 0; i < q; i++)
            Console.Write(
                   calculateNoOFactors(a[i])
                                     + " ");
    }
}
 
// This code is contributed by vt_m.

PHP

<?php
// It works properly on
// 64-bit PHP Compiler
 
// PHP program to count
// number of factors
// of an array of integers
$MAX = 1000001;
 
// array to store
// prime factors
$factor = array_fill(0, $MAX + 1, 0);
 
// function to generate all
// prime factors of numbers
// from 1 to 10^6
function generatePrimeFactors()
{
    global $factor;
    global $MAX;
    $factor[1] = 1;
 
    // Initializes all the
    // positions with their value.
    for ($i = 2; $i < $MAX; $i++)
        $factor[$i] = $i;
 
    // Initializes all
    // multiples of 2 with 2
    for ($i = 4; $i < $MAX; $i += 2)
        $factor[$i] = 2;
 
    // A modified version of
    // Sieve of Eratosthenes
    // to store the smallest
    // prime factor that divides
    // every number.
    for ($i = 3; $i * $i < $MAX; $i++)
    {
        // check if it has
        // no prime factor.
        if ($factor[$i] == $i)
        {
            // Initializes of j
            // starting from i*i
            for ($j = $i * $i;
                 $j < $MAX; $j += $i)
            {
                // if it has no prime factor
                // before, then stores the
                // smallest prime divisor
                if ($factor[$j] == $j)
                    $factor[$j] = $i;
            }
        }
    }
}
 
// function to calculate
// number of factors
function calculateNoOfFactors($n)
{
    global $factor;
    if ($n == 1)
        return 1;
 
    $ans = 1;
 
    // stores the smallest
    // prime number that
    // divides n
    $dup = $factor[$n];
 
    // stores the count of
    // number of times a
    // prime number divides n.
    $c = 1;
 
    // reduces to the next
    // number after prime
    // factorization of n
    $j = (int)($n / $factor[$n]);
 
    // false when prime
    // factorization is done
    while ($j != 1)
    {
        // if the same prime
        // number is dividing
        // n, then we increase
        // the count
        if ($factor[$j] == $dup)
            $c += 1;
 
        /* if its a new prime factor
           that is factorizing n,
           then we again set c=1 and
           change dup to the new prime
           factor, and apply the formula 
           explained above. */
        else
        {
            $dup = $factor[$j];
            $ans = $ans * ($c + 1);
            $c = 1;
        }
 
        // prime factorizes
        // a number
        $j = (int)($j / $factor[$j]);
    }
 
    // for the last
    // prime factor
    $ans = $ans * ($c + 1);
 
    return $ans;
}
 
// Driver Code
 
// generate prime factors
// of number upto 10^6
generatePrimeFactors();
$a = array(10, 30, 100, 450, 987);
$q = sizeof($a);
for ($i = 0; $i < $q; $i++)
    echo calculateNoOFactors($a[$i]) . " ";
 
// This code is contributed
// by mits.
?>

Javascript

<script>
// javascript Code For Efficient program to print
// the number of factors of n numbers
 
    var MAX = 1000001;
    var factor = [];
 
    // function to generate all prime
    // factors of numbers from 1 to 10^6
    function generatePrimeFactors() {
        factor[1] = 1;
 
        // Initializes all the positions with
        // their value.
        for (i = 2; i < MAX; i++)
            factor[i] = i;
 
        // Initializes all multiples of 2 with 2
        for (i = 4; i < MAX; i += 2)
            factor[i] = 2;
 
        // A modified version of Sieve of
        // Eratosthenes to store the
        // smallest prime factor that
        // divides every number.
        for (i = 3; i * i < MAX; i++)
        {
         
            // check if it has no prime factor.
            if (factor[i] == i)
            {
             
                // Initializes of j starting from i*i
                for (j = i * i; j < MAX; j += i)
                {
                 
                    // if it has no prime factor
                    // before, then stores the
                    // smallest prime divisor
                    if (factor[j] == j)
                        factor[j] = i;
                }
            }
        }
    }
 
    // function to calculate number of factors
    function calculateNoOfFactors(n)
    {
        if (n == 1)
            return 1;
 
        var ans = 1;
 
        // stores the smallest prime number
        // that divides n
        var dup = factor[n];
 
        // stores the count of number of times
        // a prime number divides n.
        var c = 1;
 
        // reduces to the next number after prime
        // factorization of n
        var j = n / factor[n];
 
        // false when prime factorization is done
        while (j != 1)
        {
         
            // if the same prime number is dividing n,
            // then we increase the count
            if (factor[j] == dup)
                c += 1;
 
            /*
             * if its a new prime factor that is factorizing n, then we again set c=1 and
             * change dup to the new prime factor, and apply the formula explained above.
             */
            else
            {
                dup = factor[j];
                ans = ans * (c + 1);
                c = 1;
            }
 
            // prime factorizes a number
            j = j / factor[j];
        }
 
        // for the last prime factor
        ans = ans * (c + 1);
        return ans;
    }
 
    /* Driver program to test above function */
     
        // array to store prime factors
        factor = Array(MAX).fill(0);
        factor[0] = 0;
 
        // generate prime factors of number
        // upto 10^6
        generatePrimeFactors();
 
        var a = [ 10, 30, 100, 450, 987 ];
        var q = a.length;
        for (i = 0; i < q; i++)
            document.write(calculateNoOFactors(a[i]) + " ");
 
// This code is contributed by aashish1995
</script>

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *