问题描述
求出区间[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
分析
1、首先筛选出所有的素数,用数组保存到对应位置,不是素数的则保存为0。
2、观察样例输出,发现8 = 2*4=2*2*2,所以可以用一个字符串数组保存之前的分解质因数的式子,suanshi[8] = 2*suanshi[4];
代码
public class Fenjie {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner reader = new Scanner(System.in);
int a = reader.nextInt();
int b = reader.nextInt();
int[] primeArr = new int[b+1]; //保存质数的数组
Arrays.fill(primeArr, 0);
isPrime(a,b,primeArr);//如果是质数,则存储相应的质数,否则存储0
String[] suanshi = new String[b+1];//保存分解的式子
getSuanshi(suanshi,primeArr,b);//得到质解算式
for(int i=a;i<=b;i++)
{
System.out.println(i+"="+suanshi[i]);
}
}
public static void getSuanshi(String[] suanshi,int[] primeArr,int b)
{
for(int i=2;i<=b;i++)
{
if(primeArr[i] != 0)
{
suanshi[i] = i+"";
}else
{
for(int j=2;j<=Math.sqrt(b);j++)
{
if(i % j==0) //可以整除
{
if(primeArr[i/j] !=0) //如果商是素数
{
suanshi[i] = j+"*"+(i/j);
}
else//如果商不是素数
{
suanshi[i] = j+"*"+(suanshi[i/j]);
}
break;
}
}
}
}
}
public static void isPrime(int a,int b,int[] primeArr)
{
for(int i=2;i<=b;i++)
{
int sign = 1;
for(int j=2;j<Math.sqrt(b);j++)
{
if(i % j ==0 && i!=j)
{
sign = 0;
break;
}
}
if(1==sign) //如果是质数则直接保存
{
primeArr[i] = i;
}
}
}
}