主要因素的权力总和

时间:2017-06-08 20:52:59

标签: algorithm prime-factoring

给定一个整数数组(每个<= 10 ^ 6),找到每个整数的素因子幂的最快方法是什么?

Ex:- 
    array: 4 6 12 7
    4 -> 2^2 -> 2
    6 -> 2^1 * 3^1 -> 1+1 -> 2
    12 -> 2^2 * 3^1 -> 2+1 -> 3
    7 -> 7^1 -> 1
    Answer: 2+2+3+1 = 8

2 个答案:

答案 0 :(得分:1)

检查this并尝试从那里调整一些东西。快乐的东西!

// Print the number of 2s that divide n
    while (n%2 == 0)
    {
        printf("%d ", 2);
        n = n/2;
    }

    // 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, print i and divide n
        while (n%i == 0)
        {
            printf("%d ", i);
            n = n/i;
        }
    }

    // This condition is to handle the case when n 
    // is a prime number greater than 2
    if (n > 2)
        printf ("%d ", n);

您可以在阵列中所有整数的乘积上使用上述算法,并获得相同的结果,由于节省了单个级别上所有添加操作的时间,因此可能更快。

答案 1 :(得分:0)

您可以使用sieve algorithm缩短查找数字素数的时间。对于您的问题,筛选算法中的一些修改将起作用。

你可以这样做,

// For Globally storing the sum of power of prime factors
public static int powerSum[] = new int[1000001];

// For Identifying the factor is prime or not
public static boolean prime[] = new boolean[1000001];  

public static void sieve()
{
    powerSum[0] = 0;
    powerSum[1] = 1;

    Arrays.fill(prime , true);

    prime[0] = false;
    prime[1] = false;

    for(int i = 2 ; i <= 1000000 ; i++)     // sieve algorithm
    {
        if(prime[i])   // Consider the factor for calculation only if it is prime
        {
            for(int j = i ; j <= 1000000 ; j += i)
            {
                int tempJ = j;

                while(tempJ != 0 && tempJ%i == 0)// Counting number of occurance of the factor
                {
                    powerSum[j]++;

                    tempJ /= i;
                }

                prime[j] = false;
            }
        }
    }
}

在筛选方法中,我预先计算给定范围内每个数的素因子的幂和。我使用简单的筛选方法仅考虑素因子,并且为了计算该因子的出现,我应用while循环。

现在你可以用这种方法通过这种方式找到给定范围内任何数字的素数因子的幂和,

public static void main(String args[])
{   
    sieve();

    int ans = powerSum[4] + powerSum[6] + powerSum[7] + powerSum[12];

    System.out.println(ans);
}