总结一下这道题吧
1.这道题很简单
2.我没写出来
没写出来的原因
1.题目没有完全看懂,尤其是描述中的最后一句:
"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."前半句很好理解,就是输出最多的那几个因子,后半句就比较懵逼了,我只知道sequence是序列的意思,最小的序列就有点理解无能了。书上给的解释是在连续的因子个数最多的方案有多个时,输出第一个数字最小的那一串(醍醐灌顶!),英语差非常影响做题,要注意
2.刚开始看懂这道题的时候一脸懵逼,大脑一片空白。根本想不出一种办法去实现这种在得到最大长度的同时还能输出那串序列的方法。现在回头看的话,知道序列的最大长度和该序列的第一个数字就能完全确定它了,这种思想在stl中的一些函数中有所体现,比如substr,erase等
3.书中算法的思想:把某一段连续的数字的乘积看做整体,如果这个整体能够被整除,就说明满足条件。知道这个思想就很好实现了
4.有个坑点(第一小点中没能看懂英文的锅),当没有连续(指长度大于1)的序列时,应该输出最小的那一个因子而不是他本身(确实毫无道理,抱头痛哭~~)所以anslen的初值应该设置为0以区别
5.这道题的代码有一定的冗余度,就是枚举了所有的小于sqrt(n)的正整数,存在优化的空间。我在思考解决办法的时候,总想着用一种没有冗余的完美的方法去解决它,结果走到了死胡同。
6.数据类型用long long防止在做乘法的时候数据溢出。
#include<iostream>
#include<math.h>
using namespace std;
typedef long long ll;
ll fac[100];
int main()
{
ll n,m,ansi=0;
cin>>n;
m=n;
ll b=sqrt(1.0*n);
ll c=0,anslen=0;
for(int i=2;i<=b;i++)
{
ll temp=1,j=i;
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\n"<<n;
else
{
cout<<anslen<<endl;
for(int i=0;i<anslen;i++)
{
printf("%lld",ansi+i);
if(i!=anslen-1)cout<<"*";
}
}
}