題目 A1096 Consecutive Factors
-
題意
輸入數字N
,求一段連續的整數序列,其乘積爲N
的因子。求最長的連續序列,輸出長度及序列。如果存在多個序列長度相同的情況,輸出最小的序列。 -
思路
首先需要確定思路,是採用構造連續整數乘積判斷是否能被n
整除的方式。然後確定範圍,最大爲sqrt(n)
。然後再就是存儲結果的方式,採取存儲連續序列的第一個數和長度的方式,遇到長度更大的情況時更新,這樣即可以保證更新的方便也可以滿足獲取的是長度相同情況下最小的序列。 -
Code in C++
#include <cstdio>
#include <cmath>
int main()
{
long long n;
scanf("%lld", &n);
long long sqrn = std::sqrt(n), lenth = 0, start = 0;
// 遍歷連續因子第一個數從[2,sqrt(n)]
for (int i = 2; i <= sqrn; ++i)
{
long long j = i, tmp = 1;
while(1)
{
tmp *= j;
if (n % tmp != 0) break;
if (j - i + 1 > lenth)
{
lenth = j - i + 1;
start = i;
}
++j;
}
}
// 如果無解,只有自身是自己的因子
if (lenth == 0)
{
printf("1\n%lld", n);
}
else
{
printf("%lld\n", lenth);
for (int i = 0; i < lenth; ++i)
{
if (i > 0) printf("*");
printf("%lld", start + i);
}
}
return 0;
}
小結
- 確定因子遍歷範圍
- 構造連續整數乘積作爲因子去判斷
- 利用存儲第一個整數和長度的方式保存結果