计算整数的素因子中每个数的出现次数

时间:2012-04-12 15:54:30

标签: java algorithm math primes

我想计算整数的每个素数因子的数量。例如18 = 2 ^ 1 * 3 ^ 2。我想获得每个素数的所有指数部分。对于数字18,它是1 + 2 = 3.左下是生成整数的所有素因子的程序。

    Scanner sc = new Scanner(System.in);
    int n = sc.nextInt();
    for (int i = 2; i <= n / i; i++) {
        while (n % i == 0) {
            System.out.print(i + ", ");
            n /= i;
        }
    }
    if (n > 1)
        System.out.print(n + ", ");

对于输入18,该程序打印2,3,3,....至于完成我的要求,要计算每个素数因子的出现次数,我可以先将它们全部添加到列表中,然后从列表的开始到结束的for循环可以计算每个数字的出现次数。但这个想法对我来说似乎并不好。不必要的是,我为所有素数因子添加了一个for循环,它只是告诉我这个素数因子在列表中出现了n次。
任何更好的方法来获得个别数量的素数因子一个整数。

2 个答案:

答案 0 :(得分:1)

是的,就像@attila和@robert说的那样:

import java.util.Scanner; 
import java.util.TreeMap; 

public class Test{
    public static void main( String args[] ){
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        TreeMap<Integer, Integer> factors = new TreeMap<Integer, Integer>(); 

        for (int i = 2; i <= n / i; i++) {
            int count = 0; 

            while (n % i == 0) {
                System.out.print(i + ", ");
                n /= i;
                count ++; 
            }
            if( count > 0 ) 
                factors.put( i, count ); 
        }
        if (n > 1){
            System.out.print(n + ", ");
            factors.put( n, 1 ); 
        }
        System.out.println(); 

        System.out.println( "-------------" ); 
        for( Integer factor : factors.keySet() ){
            System.out.println( factor + "^" + factors.get( factor ) ); 
        }
    }
}

我正在使用树形图,因为它保持了因素的自然顺序,这很整洁:) 你也可以使用一个应该更快一点的hashmap。但是,素数分解的实现应该是如此之慢,以至于我认为它不重要:)

答案 1 :(得分:0)

每次执行n/=i;时,您都会遇到一个因素。因此,通过在该点递增计数器(从0开始),您可以得到分解过程结束时的因子总数。

请注意,为了正确处理素数,您需要额外的if。对于素数,你没有找到任何因子,所以计数器将为0 - 在这种情况下你需要在循环之后将它设置为1(一个因素:本身)