1. 程式人生 > >#10198. 「一本通 6.2 練習 1」質因數分解

#10198. 「一本通 6.2 練習 1」質因數分解

loj的題目   caioj的題目 兩個都可以上傳啊

[題目描述] 原題來自: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