问题描述
求出区间[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
4=2*2
5=5
6=2*3
7=7
8=2*2*2
9=3*3
10=2*5
提示
先筛出所有素数,然后再分解。
数据规模和约定
2<=a<=b<=10000
一: 时间不通过
package com.xjj.lanqiao;
import java.util.Scanner;
/*----分解质因数------
* 1.先找出所以素数标记
* */
public class Lq2_16 {
public static int n;
public static int m;
public int[] book = new int[m+1]; //标记法,0表示素数,1表示不是素数
//标记素数,时间复杂度较高
public void find_prime1(){
for(int i = n; i <= m; i++)
//只需到该数的开方
for(int j = 2; j <= Math.sqrt(i); j++)
if (i % j == 0)
book[i] = 1; //不是素数
}
//筛选法标记素数:某素数i的倍数一定不是素数 --
public void find_prime(){
for(int i = 2; i <= m; i++)
if (book[i] == 0)
for(int j = i + i; j <= m; j += i)
book[j] = 1;
}
public static void main(String[] args) {
System.out.println();
Scanner scanner = new Scanner(System.in);
n = scanner.nextInt();
m = scanner.nextInt();
Lq2_16 lq = new Lq2_16();
lq.find_prime();
//遍历每一个数
for(int i = n; i <= m; i++){
//标记如果是素数
if (lq.book[i] == 0)
System.out.println(i + "=" + i);
else{
System.out.print(i + "=");
int t = i;
//从2开始除,如果能除尽则输出
for(int j = 2; j <= i/2; j++)
while((t % j) == 0){
System.out.print(j);
t = t / j;
if (t != 1)
System.out.print("*");
}
System.out.println();
}
}
}
}
二: 改进
package com.xjj.lqtest;
import java.util.Scanner;
public class Test {
public static int n;
public static int m;
public int[] book = new int[m+1];
public void find_prime1(){
for(int i = n; i <= m; i++)
for(int j = 2; j <= Math.sqrt(i); j++)
if (i % j == 0)
book[i] = 1; //不是素数
}
public void find_prime(){
for(int i = 2; i <= m; i++)
if (book[i] == 0)
for(int j = i + i; j <= m; j += i)
book[j] = 1;
}
public static void main(String[] args) {
System.out.println();
Scanner scanner = new Scanner(System.in);
n = scanner.nextInt();
m = scanner.nextInt();
Test lq = new Test();
lq.find_prime();
for(int i = n; i <= m; i++){
if (lq.book[i] == 0)
System.out.println(i + "=" + i);
else{
System.out.print(i + "=");
int t = i;
int j = 2;
//改进,当连续除其值=1时表示该数值已经除完
while(t != 1){
if((t % j) == 0){
System.out.print(j);
t = t / j;
if (t != 1)
System.out.print("*");
}
else j++;
}
System.out.println();
}
}
}
}