试题 算法训练 分解质因数 java 题解 605

问题描述 

  求出区间[a,b]中所有整数的质因数分解。

输入格式

  输入两个整数a,b。

输出格式

  每行输出一个数的分解,形如k=a1*a2*a3...(a1<=a2<=a3...,k也是从小到大的)(具体可看样例)

样例输入

3 10

样例输出

3=3
4=2*2
5=5
6=2*3
7=7
8=2*2*2
9=3*3
10=2*5

提示

  先筛出所有素数,然后再分解。

数据规模和约定

  2<=a<=b<=10000


解题思路:

先将10000内的所有素数提取至数组中(素数算法--- >传送门)。在分解某个范围的因数时,对于本身是素数的,直接特判出来(可以在筛选素数时,顺便再造个哈希表),可以省不少时间。在分解合数时,如果该合数被素数数组选中过,则下一轮仍从数组第一个开始,否则从数组第二个值判断(设置一个标志变量)。

java代码:

import java.io.*;

public class Main {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		String[] split = br.readLine().split(" ");
		int st = Integer.parseInt(split[0]);
		int end = Integer.parseInt(split[1]);
		int []arr = new int[1229];
		boolean []flag = new boolean[10001];
		int index = 0;
		for(int i = 2; i <= 10000;i++) {
			int j = 0;
			for(j = 2;j <= Math.sqrt(i);j++) {
				if(i % j == 0)break;
			}
			if(j == (int)Math.sqrt(i) + 1) {
				arr[index++] = i;
				flag[i] = true;
			}
		}
		StringBuilder builder = new StringBuilder();
		for(int i = st;i <= end;i++) {
			if(flag[i]) {
				builder.append(String.format("%d=%d\n", i,i));
			}else {
				int tag = i;
				builder.append(i + "=");
				boolean h = false;
				int j = -1;
				while(true) {
					if(!h) {
						j++;
					}else {
						j = 0;
					}
					if(tag == 1)break;
					if(tag % arr[j] == 0) {
						h = true;
						if(tag / arr[j] == 1) {
							builder.append(arr[j] + "\n");
						}else {
							builder.append(arr[j] + "*");
						}
						tag /= arr[j];
					}else {
						h = false;
					}
				}
			}
		}
		System.out.print(builder.toString().trim());
	}
}

提交截图:

Guess you like

Origin blog.csdn.net/weixin_48898946/article/details/121063671
Recommended