一个正整数 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())
yz = []
for i in range(2, int(n ** 0.5) + 1):
if n % i == 0:
yz.append(i)
if not yz:
print(1)
print(n)
else:
res = [yz[0]]
for i in range(len(yz)-1):
check = yz[i]
pre = [yz[i]]
pos = i + 1
while pos < len(yz) and yz[pos] == yz[pos - 1] + 1 and n % (check * yz[pos]) == 0:
pre.append(yz[pos])
check *= yz[pos]
pos += 1
if len(pre) > len(res):
res = pre.copy()
print(len(res))
print(*res, sep='*')
标签:printf,pos,long,因子,yz,006,L1,lld
From: https://blog.csdn.net/zjl_hui/article/details/139421020