题目描述
任意输入两个正整数 m,n(1≤m≤n≤5000),依次输出 m 到 n 之间每个数的最大质因子(包括 m 和 n;如果某个数本身是质数,则输出这个数自身)。
输入格式
一行,包含两个正整数 m 和 n,其间以单个空格间隔。
输出格式
一行,每个整数的最大质因子,以逗号间隔。
输入输出样例
输入
5 10
输出
5,3,7,2,3,5
源码
import java.util.Scanner;
public class Main{
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int m = sc.nextInt();
int n = sc.nextInt();
int[] num = new int[n-m+1];//存储输出结果
int[] prime = new int[2500];//存储素数,除2外,素数是奇数,减少数组空间
int k = 0;//num数组的下标
int r = 0;//prime数组的下标
//生成素数数组
for(int i=2;i<5000;i++) {
boolean flag = true;
for(int j=2;j<=Math.sqrt(i);j++) {
if(i%j==0) {
flag = false;break;
}
}
if(flag) {
prime[r]=i;
r++;
}
}
//开始判断:
for(int i=m;i<=n;i++) {
boolean flag = true;
for(int j=2;j<=Math.sqrt(i);j++) {
if(i%j==0) {
flag = false;
break;//及时跳出,较少循环次数
}
}
if(flag) { //是素数,存储素数本身到数组
num[k] = i;
k++;
}else { //不是素数,求最大质因子
int max = 2;//最小质因子是2
for(int p=0;p<prime.length;p++) {
if(prime[p]!=0) {
if(i%prime[p]==0) { //是质因子
if(prime[p]>max) { //判断是否是最大质因子
max = prime[p];//最大质因子赋值给max
}
}
}
}
num[k] = max; //存储最大质因子到数组
k++;
}
}
//输出结果
for(int i=0;i<num.length;i++) {
System.out.print(num[i]);
if(i<num.length-1) { //如果不是数组的最后一个元素则输出逗号
System.out.print(",");
}
}
}
}