L1-006 连续因子 (c++,python)

一个正整数 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="*")

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值