蓝桥杯--分解质因数

问题描述
  求出区间[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



一:  时间不通过

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();
			}
		}
	}

}

猜你喜欢

转载自blog.csdn.net/jiejiexiao/article/details/79575824