題目: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;
}