素因子去重(藍橋杯題)

2021-10-03 12:10:22 字數 2385 閱讀 4162

報名參加了藍橋杯,但是總是找不到合適的題庫做練習,要麼是沒有參考的解答,自己做對做錯都不知道,要麼是**一行注釋都沒有,雖然我知道這是編寫**編寫到了一種比較高的境界才能做到的,但是一開始真的不能見名知意,所以一些提示是很有必要的,甚至需要解答這段**的思路,才能夠更清晰的理解它,掌握它。

接下來,我將闡述自己的理解,即幫助了大家,也幫助了自己。

一種判斷和生成質數的方法。

bool is_prime[10005];

int prime[10005];

void sieve(int n)

//已知,2,3是素數,此處1不算,所以基於這種初始判斷,開始儲存質數

//這段**相當於質數生成器。

for(int i = 2; i <= n; i++)

} //這是一種新的生成質數的方法。

/* is_prime[2] = true

is_prime[3] = true

is_prime[4](2*2) = false

is_prime[5] = true

is_prime[6] = false

is_prime[7] = true //能夠被基本質數翻倍的,然後增加i的,都不是質數,但這樣就能列舉出所有的質數嗎?

*/}int main()}

ans *= n;

cout<;

//for

(int i = 0; i < 100; i++)

printf

("%d\n",prime[i]);

return 0;

}

下面對其進行解釋,sieve的英文含義是篩子,那麼這段功能即進行質數的篩選操作,由於全域性陣列is_prime最大只設定到了10005,所以n在此處也不能超過它,不過這不是問題,往上調節即可。

先看第乙個

for

(int i = 2; i <= n; i++)

一開始,我不知道為什麼這個i要從2開始算起,明明前面還有兩個位置,為什麼不放呢?後來一想,2不就是 「第乙個」 質數嗎?從而這裡2算第乙個,那麼這有乙個前迴圈置真操作,就是先假設所有數,2----10005都是質數,當然,這是不可能地,所以。

接下來就是第二段迴圈操作,這裡的思想是比較精髓的。

for

(int i = 2; i <= n; i++)

}

p一般在變數中,都是用來指代position這個單詞,用來表示位置,這裡一開始p = 0,符合常理,事實上,這就開始將第乙個質數2放進prime[0]了,沒錯,prime這個陣列,就是從頭到尾存質數的陣列。

一開始,我也看不懂,為什麼要先i_prime 都為true,後來又讓大多數變成false。

讓我們慢慢看。

is_prime[2] = true ------> prime[0] = 2

is_prime[3] = true ------> prime[1] = 3

is_prime[4] = false ------> 不操作

is_prime[5] = true ------> prime[2] = 5

is_prime[6] = false ------> 不操作

is_prime[7] = true ------> prime[3] = 7

首先這段迴圈,就是按照上述所說,的這樣幹活的,但是關鍵的是,false怎麼來的,怎麼判斷的呢?

for

(int j = 2 * i; j <= n; j += i) is_prime[j] = false;

沒錯就是這句話,2已經是質數了,所以2的兩倍即4,可能是質數嗎?不能,它都兩倍了,只能是偶數。那接下來,還加上了乙個2,也不會是素數,同理,不斷的加,也不可能是質數。

推廣一下,i是素數,2*i會是素數嗎?不會,2*i+i= 3 *i會是嗎?很明顯不是,因為有個3,同理,不斷的增加 i 會是嗎?肯定不會,所以,這裡判斷素數就判斷的非常的快速了,比起我以前的那種判斷素數的方法,應該是要快很多的。

下面主函式的部分,應該就沒那麼難看懂了,只需要手演算一下,很快就能知道是在講什麼。

**不來自我的原創,以下是鏈結

不知為何,我也想寫上一小段文字尾巴,就當是自己在實踐孔子,老子等聖賢的教誨吧,在學習的同時,不要忘記了我們是個人,很多網路的東西由於賺錢為目標,喪失了純淨性,就比如某站,英文第二個字母,上面既有很多學習資源,也有很多腐朽的東西,希望我們的年輕人向上,向陽光,感受自然之美好,生命之絢爛,世界上最大的奇蹟是有生命,生命中最大的奇蹟是竟然有我,身為it人,不入it的泥坑,望諸君共勉。

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

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

藍橋杯 素因子去重(迴圈 分支)

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

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

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