代码有问题,能过acwing的所有测试点,pta有一个点过不了,有无大佬帮找找错(换了个思路,过了)
题目描述
在一个正整数 N 的所有因子中,可能存在几个连续的数字。
例如,630 可以分解为 3×5×6×7,其中 5、6、7 是三个连续的数字。
现在给定任意正整数 N,请你找到最大连续因子数,并列出连续因子的最小序列。
样例
输入样例:
630
输出样例:
3
5*6*7
时间复杂度
O(logn)
错误代码
#include <bits/stdc++.h>
using namespace std;
int flg; //即时记录连续因子数量
int a[100],b[100]; //a数组保存最长连续因子,b数组保存当前连续因子
int n,ma=0; //ma记录连续因子的最大数量
int main()
{
cin>>n;
int x=n;
for(int i=2;i<=sqrt(n);i++) //最大因子小于等于sqrt(n)
{
if(x%i==0) //若i为x的因子,记数并保存
{
x=x/i;
b[flg++]=i;
if(ma<flg) //当前连续因子数大于最大连续因子数,更新最大连续因子-->
{
ma=flg;
for(int j=0;j<ma;j++) a[j]=b[j];
}
}
else
{
flg=0,x=n; //flg重新计数,重置x
}
}
if(ma==0) cout<<1<<endl<<n; //若ma=0,则说明n为质数,直接输出1和n
else
{
cout<<ma<<endl;
for(int i=0;i<ma;i++)
{
cout<<a[i];
if(i!=ma-1) cout<<"*";
}
}
cout<<endl;
return 0;
}
二刷正确代码
#include <bits/stdc++.h>
using namespace std;
int n;
int x;
int l,r,len=0;
int main()
{
cin>>n;
for(int i=2;i<=sqrt(n);i++)
{
x=1;
for(int j=i;j<=i+13;j++)
{
x*=j;
if(x>n||n%x!=0)
{
break;
}
else if(n%x==0)
{
if(len<j-i+1)
{
l=i,r=j;
len=j-i+1;
}
}
}
}
if(len>0)
{
cout<<len<<endl<<l;
for(int i=l+1;i<=r;i++) cout<<"*"<<i;
}
else cout<<1<<endl<<n;
return 0;
}
666
那个输入60
你的答案是:
2
23
但是它可以:
3
34*5