分解质因数 - Java实现

分解质因数 - Java实现

问题

给定 n 个正整数 a_i,将每个数分解质因数,并按照质因数从小到大的顺序输出每个质因数的底数和指数。

输入格式

  • 第一行包含整数 n

  • 接下来 n 行,每行包含一个正整数 a_i

输出格式

对于每个正整数 a_i,按照从小到大的顺序输出其分解质因数后,每个质因数的底数和指数占一行。每个正整数的质因数全部输出完毕后,输出一个空行。
数据范围

  • 1 ≤ n ≤ 100

  • 2 ≤ a_i ≤ 2 × 10^9

  1. 输入处理

    • 首先,程序从标准输入读取一个整数 n,表示接下来将输入 n 个正整数。

    • 然后,程序读取 n 个正整数,存储在数组 arr 中。

  2. 主逻辑

    • solution 方法是程序的主逻辑部分,它遍历数组 arr 中的每个整数,并调用 divide 方法对每个整数进行质因数分解。

    • 对于每个整数,divide 方法会输出其质因数分解的结果,每个质因数的底数和指数占一行。

    • 每个整数的质因数分解完成后,输出一个空行。

  3. 质因数分解

    • divide 方法实现了质因数分解的逻辑。它从2开始,尝试找到能整除当前整数 x 的最小质因数 i

    • 如果找到这样的 i,则计算 x 能被 i 整除多少次(即 i 的指数 e),并输出 ie

    • 然后,从 x 中移除 i 的所有因子,继续寻找下一个质因数,直到 x 被完全分解。

    • 如果最后 x 不等于1(即 x 本身是一个质数),则单独输出 x 和指数1。

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;

public class Main {
	static int n = 0;
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		PrintWriter pw = new PrintWriter(System.out);
		String[] l1 = br.readLine().split(" ");
		n = Integer.parseInt(l1[0]);
		int[] arr = new int[n];
		for(int i = 0; i < n; i++) {
			arr[i] = Integer.parseInt(br.readLine());
		}
		solution(pw,arr);
		pw.flush();
		pw.close();
		br.close();
	}
	private static void solution(PrintWriter pw, int[] arr) {
		for(int i = 0; i < n; i++) {
			divide(pw,arr[i]);
			pw.println();
		}
	}
	private static void divide(PrintWriter pw, int x) {
		for(int i = 2; i <= x/i; i++) {
			// 3、寻找下一个更大的质因子,并重复以下操作
			if(x % i == 0) {
        //由于第1、2步,可以确保每次的i都是质数
				int e = 0;
				while(x % i == 0) {
					e++;
					x /= i; //1、核心:从当前整数x中移除一次质因子i,例如x=18可以移除一个质因子2,然后变成x=9又可以移除两个质因子3
				}
				pw.println(i + " " + e);
				//2、上述循环结束后留下的x不会被i整除,即每次找到一个质因子i,都会从x中清除i,最终x会变成1或自身最大的孤立质数
			}
		}
		// 4、若x最终是最大的孤立质数,则单独输出(也就是x没有变成1)
		if(x != 1) {
			pw.println(x + " " + 1);
		}
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值