藍橋杯 演算法訓練 素因子去重(Java)
問題描述
給定一個正整數n,求一個正整數p,滿足p僅包含n的所有素因子,且每個素因子的次數不大於1
輸入格式
一個整數,表示n
輸出格式
輸出一行,包含一個整數p。
樣例輸入
1000
樣例輸出
10
資料規模和約定
n<=10^12
樣例解釋:n=1000=2^353,p=2*5=10
分析:首先將1e6以內的素數做成一個prime[]陣列(大小為1e6,是因為n的因子中小的那一個,必定小於n的平方根),然後用n來和prime[]中的素數進行運算(具體見程式碼中),對prime[]中使用到的數求乘積,最終得到結果。
但是上面的做法不能完全正確,最後一個測試資料,個人推測,應當是一個大於1e6的素數或者是他的因子有一個是大於1e6的素數,這個時候可以在最終結果上乘上一個n即可。
還要注意資料大小,之前寫成了long n = input.nextInt(); 半天沒找到錯誤原因
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Scanner;
public class Main {
static int[] prime = new int[80000];
static boolean[] tmp = new boolean[1000000];
static int primeSize = 0;
public static void main(String[] args) {
// TODO Auto-generated method stub
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
Scanner input = new Scanner(System.in);
primeCreat();
long n = input.nextLong();
int index = 0;
int ans = 1;
int t = -1;
for(int i=0; i<primeSize; i++) {
if(n%prime[i]== 0) {
while(n%prime[i] == 0) n /= prime[i];
ans *= prime[i];
}
}
ans *= n;
System.out.println(ans);
}
private static void primeCreat() {
// TODO Auto-generated method stub
for (int i = 0; i < prime.length; i++) {
prime[i] = 1;
}
for(int i=2; i<tmp.length; i++) {
if(tmp[i]) continue;
prime[primeSize++] = i;
for(int j=i*2; j<tmp.length; j+=i) {
tmp[j] = true;
}
}
}
}
網上看到的寫法:原理是一樣的,仔細想想的話,下面的程式碼比我的應該要高效一點。
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Scanner;
public class Main {
static int[] prime = new int[80000];
static boolean[] tmp = new boolean[1000000];
static int primeSize = 0;
public static void main(String[] args) {
// TODO Auto-generated method stub
//BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
Scanner input = new Scanner(System.in);
primeCreat();
long n = input.nextLong();
long ans = 1;
for(int i=2; i*i < n; i++) {
if(n%i == 0) {
while (n%i == 0) n /= i;
ans *= i;
}
}
if(n != 1)
ans *= n;
System.out.println(ans);
}
}
相關文章
- 藍橋杯--演算法訓練演算法
- 藍橋杯—演算法訓練演算法
- 藍橋杯 (java)演算法訓練 數對Java演算法
- 藍橋杯訓練2
- [Java] 藍橋杯ALGO-117 演算法訓練 友好數JavaGo演算法
- [藍橋杯][演算法訓練VIP]方格取數演算法
- 藍橋杯 演算法訓練 操作格子 (線段樹)演算法
- 藍橋杯:入門訓練 Fibonacci數列
- 藍橋杯訓練--母牛的故事(很清晰的思路)
- 藍橋杯演算法提高——字串匹配(Java)演算法字串匹配Java
- 藍橋杯 分巧克力(Java)Java
- 藍橋杯15年真題奇妙的數字暴力集合去重
- 【藍橋杯】練習題目彙總
- 2017年藍橋杯javaB組——等差素數列Java
- P9237 [藍橋杯 2023 省 A] 畫素放置
- 藍橋杯
- 藍橋杯練習系統題目集
- [Java] 藍橋杯ADV-203 演算法提高 8皇后·改Java演算法
- Java實現 藍橋杯 演算法提高 八數碼(BFS)Java演算法
- 藍橋杯:基礎練習 查詢整數
- 藍橋杯 演算法提高 字串壓縮演算法字串
- Java藍橋杯14年第五題Java
- 藍橋杯 (java) 第39級階梯Java
- 藍橋杯-分巧克力
- 藍橋杯-N皇后
- 藍橋杯真題
- 藍橋杯 買瓜
- 藍橋杯 剪格子
- [藍橋杯][基礎練習VIP]矩形面積交
- 藍橋杯練習試題程式碼及講解
- [藍橋杯][演算法提高VIP]大數加法演算法
- 閒聊藍橋杯JAVA - 生成迴文數Java
- 2024SMU藍橋訓練2補題
- [Java] 藍橋杯ADV-185 演算法提高 五次方數Java演算法
- [Java] 藍橋杯ADV-202 演算法提高 最長公共子序列Java演算法
- [Java] 藍橋杯ADV-209 演算法提高 c++_ch02_04Java演算法C++
- [Java] 藍橋杯ADV-213 演算法提高 3-2求存款Java演算法
- [Java] 藍橋杯ADV-147 演算法提高 學霸的迷宮Java演算法