我想计算整数的每个素数因子的数量。例如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次。
任何更好的方法来获得个别数量的素数因子一个整数。
答案 0 :(得分:1)
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(一个因素:本身)