乙個正整數n的因子中可能存在若干連續的數字。例如630可以分解為3*5*6*7,其中5、6、7就是3個連續的數字。給定任一正整數n,要求編寫程式求出最長連續因子的個數,並輸出最小的連續因子序列。
輸入格式
輸入在一行中給出乙個正整數n(1
輸出格式
首先在第1行輸出最長連續因子的個數;然後在第2行中按「因子1*因子2*……*因子k」的格式輸出最小的連續因子序列,其中因子按遞增順序輸出,1不算在內。
輸入樣例
630
輸出樣例
3
5*6*7
分析:用暴力破解,乙個個地嘗試呀~既然是遞增連續的因子長度~那麼肯定是不重複的幾個連著的數字相乘咯~然後就想到了階乘的概念對不對~~首先題目說了n最大就2的31次方,後來我掐指一算就知道了2的31次方是介於12的階乘和13的階乘之間的大小的~也就是說~~所求連續因子的長度再怎麼長~也長不過12個數字~那就從len=12開始,一直到len=1,看看能不能找到乙個滿足條件的序列咯~
假如長度比1大~那麼至少得兩個相鄰的數相乘~那麼這兩個數的乘積是不可能超過n的~【就是說如果不止乙個因子相乘,那麼所求因子序列的第乙個數字不可能超過sqrt(n)】那就從start = 2開始(和從1開始相乘是乙個意思啦= =乘不乘以1不都一樣嘛= =)一直到start = sqrt(n),把start * (start+ 1)*(start+2)*…【嗯對一共要乘以len的長度個~因為我們現在在嘗試是否有連續的len長度的因子相乘滿足條件】,乘完了的結果ans看看是不是n的約數~【就是看看n%ans是不是等於0咯】,等於0就好辦啦,說明已經找到這個最長的連續因子啦~快輸出~~然後直接return~~~耶耶耶~~~要是沒找到,那說明什麼呢。。說明它是個質數(就是說說明它因子只有他自己本身),那就輸出長度為1,而且因子就是n本身咯~~~
你可能會想。。既然len=1為什麼要算?因為題目裡說輸出最小的連續因子序列,那麼如果這個數不是質數,也就是說在檢驗len=1的時候發現了乙個比這個數小的因子x,那個這個x就是最小的因子啦,就不能夠是等到最後一句輸出n為最小的因子啦~~~如果n是質數,那麼小於sqrt(n)的限定情況下會保證它不找到n的本身這個數的~~~所以到最後要加上printf(「1\n%d」, n);哦~~~保證它是質數的時候也能被輸出答案~~
#include #include using namespace std;
int main() }}
printf("1\n%d", n);
return 0;
}
L1 006 連續因子 PAT
時間限制 400 ms 記憶體限制 65536 kb 長度限制 8000 b 判題程式 standard 作者 陳越乙個正整數n的因子中可能存在若干連續的數字。例如630可以分解為3 5 6 7,其中5 6 7就是3個連續的數字。給定任一正整數n,要求編寫程式求出最長連續因子的個數,並輸出最小的連續...
PAT團體程式設計天梯賽 L1006 連續因子
時間限制 400 ms 記憶體限制 65536 kb 長度限制 8000 b 判題程式 standard 作者 陳越 乙個正整數n的因子中可能存在若干連續的數字。例如630可以分解為3 5 6 7,其中5 6 7就是3個連續的數字。給定任一正整數n,要求編寫程式求出最長連續因子的個數,並輸出最小的連...
L1 006 連續因子
乙個正整數n的因子中可能存在若干連續的數字。例如630可以分解為3 5 6 7,其中5 6 7就是3個連續的數字。給定任一正整數n,要求編寫程式求出最長連續因子的個數,並輸出最小的連續因子序列。輸入格式 輸入在一行中給出乙個正整數n 131 輸出格式 首先在第1行輸出最長連續因子的個數 然後在第2行...