题目 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;
}
小结
- 确定因子遍历范围
- 构造连续整数乘积作为因子去判断
- 利用存储第一个整数和长度的方式保存结果