藍橋杯題庫之算法訓練 素因子去重

問題描述

  給定一個正整數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數據類型更好
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章