题目
一个正整数 N 的因子中可能存在若干连续的数字。例如 630 可以分解为 3×5×6×7,其中 5、6、7 就是 3 个连续的数字。给定任一正整数 N,要求编写程序求出最长连续因子的个数,并输出最小的连续因子序列。
输入格式:
输入在一行中给出一个正整数 N(1<N<231)。
输出格式:
首先在第 1 行输出最长连续因子的个数;然后在第 2 行中按
因子1*因子2*……*因子k
的格式输出最小的连续因子序列,其中因子按递增顺序输出,1 不算在内。输入样例:
630
输出样例:
3 5*6*7
最初始思路:我先把这个数的因子全部都预处理一下,再使用双指针进行,求出最长且连续的,但还是没有get到题目要求,因为不只要最长,而且要最长的因子序列相乘等于这个数。但是!!!!!!!!!把所有连续因子相乘肯定有样例是会大于这个数的。我们需要的是等于这个数,果不其然,一开始的思路只能拿下14分,而且双指针那部分想了很久,固定一个,滑动一个,得到,先存下最长的连续因子左端。有更长符合条件的再改变这个左端点。
14分代码如下:
#include<iostream>
#include<algorithm>
using namespace std;
typedef long LL;
int k=1;
int a[100005];
int h;
void get_d(LL n)
{
for(int i = 2;i<=n/i;i++)
{
if(n%i==0)
{
a[h++] = i;
if(i!=n/i) a[h++] = n/i;
}
}
sort(a,a+h);
}
int main()
{
long long n;
cin>>n;
get_d(n);
// for(int i = 0;i<h;i++)
// cout<<a[i]<<" ";
if(h==0)
{
cout<<1<<endl;
cout<<n<<endl;
}
int max1 = -1;
int left = 0,right;
for(int i = 0;i<h;i++)// i向右滑动
{
right = i;
while(right+1<h&&a[right+1]-a[right]==1)
{
right++;
}
if(right-i+1>max1)
{
max1 = right-i + 1;
left = i;
}
i = right;
}
cout<<max1<<endl;
for(int i = left;i<left+max1-1;i++)
cout<<a[i]<<"*";
cout<<a[left+max1-1]<<endl;
return 0;
20分代码如下:
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long LL;
LL n;
int main()
{
LL num,left,count =0,max1 = 0;
scanf("%lld",&n);
for(int i = 2;i<=n/i;i++)
{
num = 1;
count = 0;
for(int j = i;n%(num*j)==0;j++)
{
count++;
num*=j;
}
if(count>max1)
{
left = i;
max1 = count;
}
}
if(max1 == 0)
{
cout<<1<<endl;
cout<<n<<endl;
}
else
{
cout<<max1<<endl;
LL i = left;
for(
i = left;i<left + max1 - 1;i++)
{
cout<< i << "*";
}
cout<<i<<endl;
}
return 0;
}