問題描述
給定一個正整數n,求一個正整數p,滿足p僅包含n的所有素因子,且每個素因子的次數不大於1
輸入格式
一個整數,表示n
輸出格式
輸出一行,包含一個整數p。
樣例輸入
1000
樣例輸出
10
數據規模和約定
n<=10^12
樣例解釋:n=1000=2^3*5*3,p=2*5=10
題目大意分析
就是給一個數,找出這個數的素因子(因數(約數)中爲質數的數),並返回所有素因子的乘積,其中素因子不會重複。
舉個例子:如1000的約數有2,4,5,8,10,20,25,40,50,100,125,200,250,500,1000其中爲質數的有2,5,故結果爲2*5=10
解題思路
思路一:蠻力法。遍歷從2-n找出所有的素因子。顯而易見,這種方法可行,但是耗時太高,沒有AC。
思路二:迭代法。變量i從2開始遍歷,若n%i==0,則n=n/i,i繼續從2開始遍歷,否則i++。(這樣做就是找出最小因數)例子:1000=2*2*2*5*5*5*2*5,得到的數據就是2 2 2 5 5 5 2 5,最終得到2*5即可。對此我們要對其去重,在Java中使用HashSet來保存。(HashSet是不重複的)
代碼實現
import java.util.HashSet;
import java.util.Scanner;
public class ALGO_190_Main {
/*
思路:蠻力法搜索找出所有的該數的素因子
*/
public static void solve_1(int n){
long sum = 1;
for (int i = 2; i <= n; i++) {
if(n%i == 0){
//判斷是否爲素數
boolean isSu = true;
for (int j = 2; j <= Math.sqrt(i); j++) {
if(i % j == 0){
isSu = false;
}
}
if(isSu){
sum *= i;
}
}
}
System.out.println(sum);
}
/*
思路:每找出一個因子之後,n/=i,還是從2開始尋找。這樣能降低事件複雜度,
*/
public static void solve_2(long n){
long sum = 1;
HashSet<Long> prime = new HashSet<>();
for (long i = 2; i <= n; i++) {
if(n%i == 0){
//判斷是否爲素數
boolean isSu = true;
for (int j = 2; j <= Math.sqrt(i); j++) {
if(i % j == 0){
isSu = false;
}
}
if(isSu){
prime.add(i);
n /= i;
i = 1; //因爲i++,所有i設置爲1
}
}
}
for(long t:prime){
sum *= t;
}
System.out.println(sum);
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
long n = in.nextLong();
solve_2(n);
}
}
tips
- 程序要求,我們使用long數據類型更好