试题:
资源限制
时间限制:1.0s 内存限制:256.0MB
问题描述
给定一个正整数n,求一个正整数p,满足p仅包含n的所有素因子,且每个素因子的次数不大于1
输入格式
一个整数,表示n
输出格式
输出一行,包含一个整数p。
样例输入
1000
样例输出
10
数据规模和约定
n<=10^12
样例解释:n=1000=2^353,p=2*5=10
题意:求给定的正整数的素因子之积
本题难点:
- 数据规模大,在java中使用long来保存,c++使用long long int
- 如果使用暴力枚举会导致运行超时
解决思路:
本题是常见的大规模数据问题,可以使用万能工具“Math.sqrt()”
1.素因子首先得是因子,故缩小范围求因子:
for (long i=2;i<=Math.sqrt(num);i++){
if(num%i==0){
//...
}
}
2.对因子进行素数判定
if(f(i)){
longs.add(i);
}
if(f(num/i)){
longs.add(num/i);
}
完整代码:
import java.util.HashSet;
import java.util.Iterator;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
long num = in.nextLong();
HashSet<Long> longs = new HashSet<>();
for (long i=2;i<=Math.sqrt(num);i++){
if(num%i==0){
if(f(i)){
longs.add(i);
}
if(f(num/i)){
longs.add(num/i);
}
}
}
System.out.println(longs);
long result =1;
Iterator<Long> iterator = longs.iterator();
while(iterator.hasNext()){
result *= iterator.next();
}
System.out.println(result);
}
//素数判定
private static boolean f(long num){
for(int i=2;i<=Math.sqrt(num);i++){
if(num%i==0){
return false;
}
}
return true;
}
}