1. 程式人生 > >L1-006 連續因子(20)(思路+測試點分析)

L1-006 連續因子(20)(思路+測試點分析)

L1-006 連續因子(20 分)

一個正整數 N 的因子中可能存在若干連續的數字。例如 630 可以分解為 3×5×6×7,其中 5、6、7 就是 3 個連續的數字。給定任一正整數 N,要求編寫程式求出最長連續因子的個數,並輸出最小的連續因子序列。

輸入格式:

輸入在一行中給出一個正整數 N(1<N<2​31​​)。

輸出格式:

首先在第 1 行輸出最長連續因子的個數;然後在第 2 行中按 因子1*因子2*……*因子k 的格式輸出最小的連續因子序列,其中因子按遞增順序輸出,1 不算在內。

輸入樣例:

630

輸出樣例:

3
5*6*7

思路 :

          題目要求輸入一個數,輸出

最長最小連續因子,而輸出資料特徵:起始值,連續長度。由於數N【sqrt(N),N】不可能存在連續因子,所以我們只需在【2,sqrt(N)】區間以不同的起始值,更新最終起始值(start)和連續因子長度(maxcount)即可

注意:對於素數,連續因子就是本身,且長度為1(測試點5/6)

#include<iostream>
#include<cmath>
using namespace std;
int main() {
	int N, temp;
	int count = 0, maxcount = 0, start = 0;
	cin >> N;
	for (int i = 2; i <= sqrt(N) ; i++) {
		temp = N;
		count = 0;
		int j = i;
		while (temp%j==0) {
				temp /= j++;
				count++;			
		}
		if (count > maxcount) {
			maxcount = count;
			start = i;
		}	
	}
	if (maxcount) {
		cout << maxcount << endl;
		for (int i = 0; i < maxcount; i++) {
			cout << start + i;
			if (i != maxcount - 1)
				cout << "*";
		}
	}
	else
		cout <<"1"<<endl<< N;
	return 0;
}