1096 Consecutive Factors (20 分)
題目傳送門:1096 Consecutive Factors (20 分)
一、題目大意
給定一個數整數n,求n分解成多個因子相乘後,包含最長的連續因子的個數。
如果包含最長連續因爲個數的解有多個,則輸出最小的一組解。
二、解題思路
剛開始想歪了,我居然打表打出了12!內的連續整數成績的種類和對應的數量,這樣其實是錯的,因爲這個連續區間最多是【1,12】,然而,居然還能過5組數據,呵呵😑只能說數據量太小了。
然後我就改了寫法,就是直接實時判斷,不預先打表。就是遍歷n的每一個因子,然後判斷以這個因爲爲連續序列的頭一個數字,那麼這個連續序列有多長。通過打擂臺存儲最長的連續序列即可。想要存儲一個連續序列,只需要存第一個數字和序列的長度即可。
注意:此時遍歷n的因子時,for
的條件控制部分不能寫成i*i<=n
, 因爲n
過大時,i
達到sqrt(n)+1
的時候,i*i
超過了int
的範圍,變成了負數,那i*i<=n
依舊成立,造成死循環,結果就是在最後一組數據時運行超時。這裏將i*i<=n
改成i<=sqrt(n)
即可。
三、AC代碼
#include<bits/stdc++.h>
using namespace std;
int main(){
int n;
cin >> n;
int max = 0, m = sqrt(n);// 注意此時m = sqrt(n)
pair<int, int>res;
for(int i = 2; i <= m; i++){// 如果此時寫成i*i<=n,則最後一組數據無法通過,因爲兩個剛好大於sqrt(n)的值相乘超過了int範圍,變成了負數,還能符合i*i<=n,造成了死循環,所以運行超時。
if(n % i == 0){// i 爲因子
int a = n, b = i;// 從i開始,看連續的因子能有多長
while(a % b == 0){
a/=b;
b++;
}
if(b - i > max){ // 是否能更新長度和結果
max = b - i;
res = {i, max};
}
}
}
if(!max){
cout << 1 << endl << n << endl;
return 0;
}
cout << max << endl;
cout << res.first;
for(int i = 1; i < res.second; i++){
cout << "*" << res.first+i;
}
cout << endl;
}