试题:因子化简

目录

问题描述

样例输入

样例输出

代码


问题描述

样例输入

3

2155895064 3

2 2

10000000000 10

样例输出

2238728

1

10000000000

代码

#include <iostream>
using namespace std;
/*
因子化简:
	一共有三个函数,一个主函数,一个判断是否为素数的函数,一个计算结果的函数
	 
注意:
	大数和它的因子必须定义成long long,因为int会越界 
*/
int is_primes(long long num){
	if(num <= 1)
		return 0;
	for(long long i = 2; i * i <= num; i++){
		if(num % i == 0){
			return 0;
		}
	}
	return 1;
}

long long simplify_value(long long x, int y){
	// 定义一个二维数组用于存储素因子及其指数
	long long primes[100][2] = {0}; // 初始化为0,避免未初始化的值
	int count = 0;
	
	// 计算素因子及其指数
	for(long long i = 2; i * i <= x; i++){
		if(is_primes(i) == 1 && x % i == 0){
			primes[count][0] = i; // 存储素因子
			while(x % i == 0){
				x /= i;
				primes[count][1] += 1; // 素因子的指数加1
			}
			count++;
		}
	}
	if(x > 1){
		primes[count][0] = x;
		primes[count][1] = 1;
		count++;
	}
	
	// 计算简化后的值
	long long result = 1;
	for(long long i = 0; i < count; i++){
		if(primes[i][1] >= y){
			for(long long j = 0; j < primes[i][1]; j++){
				result *= primes[i][0];
			}
		}
	}
	return result;
}

int main(){
	int n;
	scanf("%d", &n);
	
	long long queries[n][2];
	for(int i = 0; i < n; i++){
		scanf("%lld %lld", &queries[i][0], &queries[i][1]);
	}
	
	for(int i = 0; i < n; i++){
		printf("%lld\n", simplify_value(queries[i][0], queries[i][1]));
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值