一个正整数 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
部分测试点分析:
测试点1: 子序列的积也要是N的因子
测试点3: 不要用一维指针,用二维指针,每个因子当作子序列开头的情况都要遍历,一维指针会跳过很多种情况
测试点4: N是完全平方数
c语言代码
#include"stdio.h"
#include"math.h"
int main() {
long long n, a, count, max = 0, x = 1, f = 0, s;
scanf("%lld", &n);
long long j;
for (long long w = 2;w <= sqrt(n);w++) {
if (n % w == 0) {
f = 1;
break;
}
}
if (f == 1) {
for (long long i = 2;i <= sqrt(n);i++) {
count = 1;
s = i;
if (n % i == 0) {
a = i;
for (j = i + 1;j <= sqrt(n);j++) {
s = s * j;
if (n % j == 0 && j - a == 1 && n % s == 0) {
count++;
a = j;
}
}
if (n % (a + 1) == 0 && (a + 1) > sqrt(n) && count == 1)count++;
if (count > max) {
max = count;
x = i;
}
}
}
printf("%lld\n", max);
printf("%lld", x);
long long sum = x;
for (long long j = x + 1;j < x + max;j++) {
printf("*%lld", j);
sum = sum * j;
if (sum >= n) break;
}
printf("\n");
}
else {
printf("1\n");
printf("%lld\n", n);
}
}
python代码
n = int(input())
lst = []
for i in range(2,int(n**0.5)+2):
if n % i == 0:
lst.append(i)
if not lst:
print(1)
print(n)
exit(0)
res1 = 0
res2 = n
for i in range(len(lst)):
now = lst[i]
cnt = 1
while i+cnt < len(lst) and lst[i+cnt] - lst[i+cnt-1] == 1 and n % (now*lst[i+cnt]) == 0:
now *= lst[i+cnt]
cnt += 1
if cnt > res1:
res1 = cnt
res2 = lst[i]
res = [i for i in range(res2,res2+res1)]
print(res1)
print(*res,sep="*")