L1-006. 连续因子
时间限制
400 ms
内存限制
65536 kB
代码长度限制
8000 B
判题程序
Standard
作者
陈越
一个正整数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
这道题有点坑,如果是素数呢?那只能输出它本身,
暴力枚举的话会超时,由于12!超过了int的范围,所以长度最大只会为12...
AC代码:
#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
int main()
{
int n;
scanf("%d", &n);
int maxx = sqrt(n);
for(int len = 12; len >= 1; len--)
{
for(int start = 2; start <= maxx; start++)
{
long long int ans = 1;
for(int i = start; i - start < len; i++)
{
ans *= i;
}
if(n % ans == 0)
{
printf("%d\n%d", len, start);
for(int i = start + 1; i - start < len; i++)
{
printf("*%d", i);
}
return 0;
}
}
}
printf("1\n%d", n);
return 0;
}
AC代码2:
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<queue>
#include<string.h>
#include<algorithm>
using namespace std;
const int maxn=10000007;
const double INF=0x3f3f3f3f;
int main()
{
long long n, i, j, cnt, minn=0, ans=0;
scanf("%lld", &n);
for(i=2; i*i<=n; i++)
{
cnt=1;
for(j=i; cnt*j<=n; j++)
{
cnt*=j;
if(n%cnt==0)
{
if(ans<j-i+1)
{
ans=j-i+1;
minn=i;
}
}
}
}
if(minn==0)
{
ans=1;
minn=n;
}
printf("%d\n", ans);
for(i=minn; i<minn+ans; i++)
{
if(i>minn)
printf("*");
printf("%d", i);
}
puts("");
return 0;
}
参考博客链接:
http://blog.youkuaiyun.com/liuchuo/article/details/51989000
https://www.cnblogs.com/w-y-1/p/6580823.html