资源限制
时间限制:1.0s 内存限制:512.0MB
问题描述
求出区间[a,b]中所有整数的质因数分解。
输入格式
输入两个整数a,b。
输出格式
每行输出一个数的分解,形如k=a1a2a3…(a1<=a2<=a3…,k也是从小到大的)(具体可看样例)
样例输入
3 10
样例输出
3=3
4=22
5=5
6=23
7=7
8=222
9=33
10=25
提示
先筛出所有素数,然后再分解。
数据规模和约定
2<=a<=b<=10000
在写这个题的时候,我创建素数表的空间写了10000,然后一直报超时的错误,我还以为是我的代码写的太复杂了,然后我就一直在改,耗费了很多时间,所以以后类似的题目尽量将数组的存放空间设置大一点
代码示例如下:
import java.util.Scanner;
public class 分解质因数 {
//存放素数的数组
static int[] ans=new int[100000];
//判断是否为素数
public static boolean isPrime(int n){
for (int i = 2; i <= Math.sqrt(n); i++) {
if(n%i==0){
return false;
}
}
return true;
}
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int a=sc.nextInt();
int b=sc.nextInt();
//创建素数表
int z=0;
for (int i = 2; i < ans.length; i++) {
if(isPrime(i)){
ans[z]=i;
z++;
}
}
for (int i = a; i <= b; i++) {
System.out.printf("%d=",i);
//如果有1则直接输出
if(i==1){
System.out.printf("%d=%d",1,1);
}else {
//将i的值赋给j,以更好地求i的质因数,k表示遍历ans
int j=i,k=0;
//i的质因数肯定是要小于i的
while (ans[k] <= i) {
//j已经是素数
if(j==ans[k]){
System.out.printf("%d",ans[k]);
break;
}
//j不是素数
else {
//如果ans[k]是i的质因数
if(j%ans[k]==0){
System.out.printf("%d*",ans[k]);
j/=ans[k];
}else {
k++;
}
}
}
}
System.out.println();
}
}
}
若有更好的想法欢迎与我交流呀