质因数分解的简单例子
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对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树