PAT-A-1096 Consecutive Factors (20 分)最長連續因子 C++題解

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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章