L1-006 连续因子 (20 分)

该博客讨论了一种算法,用于寻找给定正整数的最大长度连续因子序列。程序通过遍历不同长度的连续因子组合,找到满足条件的最小连续因子序列。输入一个正整数,程序首先计算其平方根作为搜索范围上限,然后尝试不同起始点的连续因子,最终输出最长连续因子的个数及其序列。
摘要由CSDN通过智能技术生成

题目描述

一个正整数 N 的因子中可能存在若干连续的数字。例如 630 可以分解为 3×5×6×7,其中 5、6、7 就是 3 个连续的数字。给定任一正整数 N,要求编写程序求出最长连续因子的个数,并输出最小的连续因子序列。

输入格式:

输入在一行中给出一个正整数 N(1<N<2​^31​​ )。

输出格式:

首先在第 1 行输出最长连续因子的个数;然后在第 2 行中按 因子1因子2……*因子k 的格式输出最小的连续因子序列,其中因子按递增顺序输出,1 不算在内。

输入样例:

630

输出样例:

3
5*6*7

心得

本题主要是提出了一种想法
与题目一一对应
最长连续因子的个数——length从长(12)到短(1)
最小的连续因子序列——第一个数从小(2)到大( sqrt(N))

代码实现

#include<bits/stdc++.h>
using namespace std;

int main()
{
	int len=0, j=0, start = 2, flag = 0;
	long long mul = 1, N = 0;
	scanf("%lld", &N);
	int sqn = sqrt(N);//N平方根即最大数限制
	for (len = 12; len >= 1; len--)//最大长度为12
	{
		for (start = 2; start <= sqn; start++)//第一个数由2到sqn
		{
			mul = 1;
			for (j = start; j <len+start; j++)//由第一个数乘len个数
			{
				mul *= j;
			}
            if(mul>N)break;//如果乘积大于N,说明当前长度已经不符合了,应该减1
			if (N % mul == 0)
			{
				flag = 1;
				break;
			}
			
		}
		if (flag == 1)//找到了
		{
			break;
		}
	}
	if (len == 0)//没找到,只能为1
	{
		printf("%d\n%d", 1, N);
		return 0;
    }
	printf("%d\n%d", len, start);//注意输出格式,最后不能有空格
	for (j = 1; j < len; j++)
	{
		printf("*%d", start + j);
	}
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值