CCFCSP202312-2因子化简java(暴力)(80分)

import java.util.Scanner;

class Main {

	public static void main(String[] args) {
		Scanner sc =new Scanner(System.in);
        //录入数据
		int q = sc.nextInt();
		long[][] arr = new long[q][2];
		for (int i = 0;i < q;i++) {
			for (int j = 0;j < 2;j++) {
				arr[i][j] = sc.nextLong();
			}
		}
        //循环遍历数组arr,目的:得到简化后的值
		for (int i = 0;i < q;i++) {
            //如果第一个值是1,直接输出1,否则进入方法shuchu(输出)
			if (arr[i][0] == 1) {
				System.out.println(1);
			}else {
				System.out.println(shuchu(arr[i][0],arr[i][1]));
			}
		}
	}
    //找到简化后的值
	public static long shuchu(long a,long b) {
        //处理当第一个值为2时的情况
		if (a == 2) {
			if (b > 1) {
				return 1;
			}else {
				return 2;
			}
		}
        //定义数组arr,存储素因子	
		long[] arr = new long[(int)Math.sqrt(a) + 10];
        //定义s,临时存储第一个值
		long s = a;
        //定义ii,作为数组arr的下标
		int ii = 0;
        //循环得到素因子数组
		while (s != 1) {
            //循环得到素因子存进arr
			for (int i = 2;i < a;i++) {
                //如果i为素数,并且i是s的因子
				if (sushu(i) && i * (s / i) == s) {
                    //将i存进数组,ii自加1
					arr[ii] = i;
					ii++;
                    //临时的第一个值除以i
					s /= i;
                    //得到素因子后,退出循环,进行下一次的素因子寻找
					break;
				}
			}
		}
        //定义ls等于0,当arr[ls]等于0时,说明素因子已经遍历完毕
		int ls = 0;
        //定义o,作为不同素因子的下标
		int o = 0;
        //循环简化a
		while (arr[ls] != 0) {
            //定义num作为素因子
			long num = arr[o];
            //定义count为素因子的个数
			int count = 0;
            //循环遍历arr得到素因子的个数
			for (int i = 0;i < ii;i++) {
                //如果arr[i]等于1,说明已经遍历过,跳过本次循环
				if (arr[i] == 1) {
					continue;
				}
                //如果arr[i]不等于num,说明不是要找的素因子,跳过
				if (arr[i] != num) {
					o = i;
					continue;
				}
                //如果arr[i]等于num
				if (arr[i] == num) {
                    //将arr[i]更新为1
					arr[i] = 1;
                    //素因子的个数自增1
					count++;
                    //确定素因子遍历玩的标志ls自增1
					ls++; 
				}
			}
            //如果素因子的个数不等于0,并且小于第二个值
			if (count != 0 && count < b) {
                //第一个值除以该素因子的乘积
				a /= (int)Math.pow(num, count);
			}
		}
        //返回化简后的值
		return a;
	}
    //判断是否是素数
	public static boolean sushu(long x) {
		boolean flag = true;
		for (int i = 2; i < Math.sqrt(x); i++) {
			if (x % i == 0) {
				flag = false;
			}
		}
		return flag;
	}
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值