藍橋杯 演算法訓練 素因子去重

2021-10-04 04:14:12 字數 1240 閱讀 2207

問題描述

給定乙個正整數n,求乙個正整數p,滿足p僅包含n的所有素因子,且每個素因子的次數不大於1

輸入格式

乙個整數,表示n

輸出格式

輸出一行,包含乙個整數p。

解題思路

1.先求出小於10的6次方的所有素數,因為n至多只存在乙個大於sqrt(n)的素因數。

2.然後在這些素數中找出n的因數。

求素數時,我採用了王道考研系列——計算機考研機試指南上的素數篩選法進行快速篩選。具體思路:初始化:從0~10的6次方都標記為false。篩選過程:如果標記為true則表示為非素數,直接跳過。如果為false,則是素數,進行記錄,並將當前數的倍數都標記為非素數。

源**

#include

int prime[

1000000];

bool mark[

1000001];

int primesize;

//篩選出小於1000000的素數

void

init()

primesize=0;

for(

int i=

2;i<=

1000000

;i++)}

}int

main()

}}if(n!=

0) ans[anssize++

]=n;

int result=1;

for(

int i=

0;i)printf

("%d\n"

,result)

;return0;

}

**詳解

1.if(i>1000)continue; 這句一定要加!!!

因為下一句j=i*i,當i過大時,j會超出int值的範圍,程式會意外終止。

2.n一定要用long long

因為n的上限是10的12次方,超過int的資料範圍。

如果不用long long,則通不過最後乙個測試用例。

3.for(int j=ii;j<=1000000;j+=i)

這裡記錄i所有倍數都為非素數時,並未從2 * i開始標記,而是直接從ii開始標記。因為i * k(k

藍橋杯 演算法訓練 素因子去重

問題描述 給定乙個正整數n,求乙個正整數p,滿足p僅包含n的所有素因子,且每個素因子的次數不大於1 輸入格式 乙個整數,表示n 輸出格式 輸出一行,包含乙個整數p。樣例輸入 樣例輸出 資料規模和約定 n 10 12 樣例解釋 n 1000 2 3 5 3,p 2 5 10 題解 試除法.列舉素因子,...

藍橋杯 演算法訓練 素因子去重

今天做了一道比較簡單的題,但是思路很有意思 其實是被素因子這個概念卡了一會兒 所以就放了上來。資源限制 時間限制 1.0s 記憶體限制 256.0mb 問題描述 給定乙個正整數n,求乙個正整數p,滿足p僅包含n的所有素因子,且每個素因子的次數不大於1 輸入格式 乙個整數,表示n 輸出格式 輸出一行,...

藍橋杯備賽 演算法訓練 素因子去重

問題描述 給定乙個正整數n,求乙個正整數p,滿足p僅包含n的所有素因子,且每個素因子的次數不大於1 輸入格式 乙個整數,表示n 輸出格式 輸出一行,包含乙個整數p。樣例輸入 1000 樣例輸出 10資料規模和約定 n 10 12 樣例解釋 n 1000 2 3 5 3,p 2 5 10 原題目這裡有...