疑问
暂无
代码
#include "bits/stdc++.h"
using namespace std;
//输入的数字的大小
int n;
//最长连续因子的开头
int first;
//最长连续因子的连续值
int len;
int main(){
scanf("%d",&n);
//初始化,记得考虑到n为质数的情况
first = 0;
len = 0;
//求根号
int sqr = (int)sqrt(1.0 * n);
for(int i=2;i<=sqr;i++){
if(n % i == 0){
//如果i是n的因子
int tmp = n;
int curlen = 0;
//开始从i遍历其后面的
for(int j=i;tmp % j == 0;j++){
curlen++;
if(curlen > len){
//只有大于才会替换
len = curlen;
first = i;
}
tmp = tmp / j;
}
}
}
//说明n是质数
if(len == 0){
len = 1;
first = n;
}
printf("%d\n",len);
for(int i=0;i<len;i++){
printf("%d%c",first+i,i!=len-1?'*':NULL);
}
return 0;
}
反思
- 我们首先假设遍历
i
从2~n
,去寻找以这个i
开头的最大连续因子,然后我们发现当i
大于 n \sqrt n n之后,以i
开头的最大连续因子大小只能是1
,所以我们将遍历的范围缩小到2 ~ n \sqrt n n。(我一开始没想到,是看《算法笔记》上面的题解的)。 - 提交代码遇到
reference to ' *** ' is ambiguous
错误,是因为自己写的变量或者方法的名字跟用到的c++库里面的名字重了,需要修改变量名或者方法名。
二刷代码
- 二刷的时候就没看懂题意了,我以为的是所有的因子,只要它们连续就好了。结果发现,并不是这么一回事。原来还是要在一组特定因子里面的连续因子。。。
- 然后对于质数需要进行特判,而且因子里面不能有1.
#include<iostream>
#include<cmath>
#include<algorithm>
using namespace std;
int n;
int maxval=0;
int start;
int main(){
scanf("%d",&n);
//注意只要到sqrt(n)就好了
int sqr = (int)sqrt(1.0*n);
int cur=2;
while(cur<=sqr){
if(n%cur==0){
int tmp=n;
int cnt=0;
int j=cur;
while(tmp%j==0){
cnt++;
tmp=tmp/j;
j++;
}
if(cnt>maxval){
maxval=cnt;
start=cur;
}
}
cur++;
}
if(maxval==0){
printf("1\n%d",n);
}else{
printf("%d\n",maxval);
for(int i=0;i<maxval;i++){
printf("%d",start+i);
if(i!=maxval-1){
printf("*");
}
}
}
return 0;
}