PTA A1096 Consecutive Factors(20分)

題目:click me~

題意:給出整數N,需要找到連續因子的最大個數,若有多個,輸出第一個數最小的那個序列。

解題思路:

步驟一:首先注意到,N不會被除自己外的大於sqrt(N)的整數整除,因此只需要從2~sqrt(N)遍歷連續整數的第一個,求此時N能被最多多少個連續整數的乘積整除。在此過程中,如果發現長度比當前最長長度anslen更長的情況(anslen初始化爲0),就更新anslen和對應第一個整數ansi。

步驟二:若遍歷結束後anslen還是等於0,那麼說明答案就是N本身;否則,輸出[ansi,ansi+anslen)區間內的整數。

code

#include<iostream>
#include<cmath>
#include<cstdlib>
using namespace std;
typedef long long LL;
int main() {
	LL n;
	cin >> n;
	LL sqr = (LL)sqrt(1.0*n);
	LL ansi=0, anslen=0;//anslen爲最長連續整數個數,ansi爲對應的第一個整數
	for (LL i = 2;i <= sqr;i++) {
		LL temp = 1, j = i;//temp爲當前連續整數的乘積
		while (1) {
			temp *= j;
			if (n%temp != 0)break;//若不能整除,則結束計算
			if (j - i + 1 > anslen) {//發現了更長的長度
				ansi = i;//更新
				anslen = j - i + 1;
			}
			j++;//下一個整數
		}
	}
	if (anslen == 0)cout << "1" << endl << n;
	else {
		cout << anslen << endl;
		for (int i = 0;i < anslen;i++) {
			if (i != 0)cout << "*";
			cout << ansi + i;
		}
	}
	
	return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章