您的位置:首页 > 编程语言 > Java开发

质因数分解的简单例子

2016-07-11 17:00 387 查看
思路:

构造出一个素数表。

将需要分解的数与从最小的素数开始判断,凡是能整除的,就进行除法运算,直到不能整除。

取下一个更大的素数,再次判断是否能整除,若可以,进行除法运算。

效果

360的质因数分解:
2*2*2*3*3*5=360


实现

/**
* 质因数分解
* 输入一个数字,分解成素数相乘
*/

import java.util.*;

public class PrimeFactor {
public static void main(String[] args) {
int num = 360;
HashMap<Integer, Integer> t = primeFactor(num);
Iterator<Integer> p = t.keySet().iterator();
Iterator<Integer> c = t.values().iterator();

System.out.println(num + "的质因数分解: ");
while (p.hasNext()) {
//素数的值
int t_p = p.next();
//素数相乘的次数
int t_c = c.next();

for (int i = 0; i < t_c; i++) {
System.out.print(t_p);
if (c.hasNext()) {
System.out.print("*");
}
}
}
System.out.println("=" + num);
}

public static HashMap<Integer, Integer> primeFactor(int num) {
HashMap<Integer, Integer> pri_num = new HashMap<Integer, Integer>();
ArrayList<Integer> primes = new ArrayList<Integer>();
int counts = Prime.calculateNumber(num, primes);
int tempC;
for (int i = 0; i < counts; i++) {
tempC = 0;
if (num % primes.get(i) == 0) {
while (num % primes.get(i) == 0) {
num /= primes.get(i);
tempC++;
}
pri_num.put(primes.get(i), tempC);
}
}
return pri_num;
}

/**
* 筛选出一个素数表,存进primes里
* */
public static void calculateNumber(int Nmax, List<Integer> primes) {
boolean[] isPrime = new boolean[Nmax + 1];
//筛掉偶数,假定所有奇数为素数
for (int i = 3; i <= Nmax; i += 2) {
isPrime[i] = true;
}
isPrime[2] = true;
for (int i = 3; i <= Math.sqrt(Nmax); i += 2) {
if (isPrime[i] == true) {
// 偶数是不需要判断的
// j+=2*i中i必定是奇数,那么i*2之后必定是偶数
// 奇数+偶数=奇数,所以j一直是奇数,从而排除了标记偶数
for (int j = i * i; j <= Nmax; j += 2 * i) {
isPrime[j] = false;
}
}
}
for (int i = 1; i <= Nmax; i++) {
if (isPrime[i] == true) {
primes.add(i);
}
}
}
}


END

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  质因数分解 java