题意
Among all the factors of a positive integer N, there may exist several consecutive numbers. For example, 630 can be factored as 3*5*6*7, where 5, 6, and 7 are the three consecutive numbers. Now given any positive N, you are supposed to find the maximum number of consecutive factors, and list the smallest sequence of the consecutive factors.
输入格式
Each input file contains one test case, which gives the integer N
输出格式
For each test case, print in the first line the maximum number of consecutive factors. Then in the second line, print the smallest sequence of the consecutive factors in the format “factor[1]factor[2]…*factor[k]”, where the factors are listed in increasing order, and 1 is NOT included.
输入样例
630
输出样例
3
5∗6∗7
思路
i从2~sqr遍历,找以i为起点的最多的consecutive factors。然后不断更新index 和 maxlen
代码
/**
* @tag PAT_A_1096
* @authors R11happy (xushuai100@126.com)
* @date 2017-2-19 14:32-15:12
* @version 1.0
* @Language C++
* @Ranking 1445/903
* @function null
*/
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long LL;
int main(int argc, char const *argv[])
{
LL N;
scanf("%lld", &N);
int maxLen = 0;
int index = 0;
LL sqr = (LL)sqrt(1.0*N);
for(int i = 2; i<=sqr; i++)
{
int curLen = 0;
LL tmp = i;
if(N % i == 0)
{
curLen++;
for(int j = i+1; j<=sqr; j++)
{
tmp*=j;
if(N % tmp==0) curLen++;
else break;
}
if(curLen > maxLen)
{
index = i;
maxLen = curLen;
}
}
}
if(maxLen == 0)
{
printf("1\n");
printf("%lld\n",N );
}
else
{
printf("%d\n",maxLen );
for(int i = 0; i<maxLen-1; i++)
{
printf("%d*", index+i);
}
printf("%d\n",index+maxLen-1 );
}
return 0;
}
收获
如果factor不要求为prime,就不用套
struct Factor
{
long long x;
int cnt;
}fac[15];
的模板,直接遍历更新数值就好