#10198. 「一本通 6.2 練習 1」質因數分解
阿新 • • 發佈:2018-11-21
[題目描述] 原題來自:NOIP 2012 普及組
已知正整數 n 是兩個不同的質數的乘積,試求出較大的那個質數。
[輸入格式]
輸入只有一行,包含一個正整數 n。
[輸出格式]
輸出只有一行,包含一個正整數 p,即較大的那個質數。
[樣例輸入]
21
[樣例輸出]
7
[資料範圍與提示]
對於 30%的資料,n≤1000
對於全部資料,6≤n≤2×10^9
思路:不得不承認,這道題我剛開始是真的想複雜了,然後在不斷的除錯之中,發現這道題真tmd簡單,其實就是 一個輸入,一個迴圈,一個判斷,就這麼簡單,可能會有很多人想到的是如果我們輸入的是一個質數的話,肯定會輸出質數本身。
這個想法是錯誤的,為什麼呢?先看一下題目吧
已知正整數 nnn 是兩個不同的質數的乘積,試求出較大的那個質數。
不難理解,兩個不同的指數的乘積,那麼請問質數本身是不是和1相乘的,那麼1是質數嗎?所以的話,所以的質數的輸入,只會輸出一個答案,就是1,因為他們根本判斷不了,輸入的時候就已經打破的協議
然後的話就很簡單的,為什麼呢?
因為我們既然已經想清楚了標題的話,那麼就是說:只要這個數本身從2這個質數開始迴圈,只要n%i==0,就是成立的,而且第一個成立的就是最小的質因數,而且質因數是兩兩為一組,只要你知道了最小的,最大的不就是原數除以最小的嗎?
我解釋清楚了對嗎?好的,那我就預設你們都懂了啊
上程式碼,程式碼我已經寫的很清楚了啊
/* 題意一定要理解清楚 不然你除錯一百年都除錯不出來 已知正整數 n是兩個不同的質數的乘積,試求出較大的那個質數。 理解清楚兩個不同的質數的乘積 也就是說這個數本身不能是質數,否則就只會輸出1 */ #include<cstdio> #include<cstdio> #include<cstring> using namespace std; int main() { int n; scanf("%d",&n); for(int i=2;i<=n;i++) { if(n%i==0) { printf("%d",n/i); return 0; } /* 這個就是看數學基礎了,如果清楚分解質因數的話,就會知道 質因數是兩兩一組的,所以只要從2這個質數開始迴圈判斷的話 第一個mod=0的數,就是最大和最小質因數的那一組解 那麼用要分解的數除以最小的質因數就是最大的質因數 比如說:21 21%2!=0,但是21%3=0,那麼3就是21的一個質因數 然後21/3=7就是和3成為一組的質因數 因為3是最小的,所以7就是最大的 */ } }
千萬不要感到驚訝,因為我也很驚訝, QAQ