L1-006 连续因子 (20 分)

连续因子 (20 分)

一个正整数 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值;

2、然后确定这道题我们要怎么解决;

        (1)明确用循环(为什么用循环呢,因为我们的因子都是多次循环才能找到的)

        (2)循环要怎么用(求解因子;求解连续因子;我们还要求解连续因子的个数,因为要输出最多连续因子个数的连续因子;我还要求这个连续因子的起点,比如630的最长连续因子是5*6*7,起点是5,然后在递增输出就好了,所以起点我也要知道)

        (3)确定用双循环(因为我一边要确定连续因子,我还要确定连续因子个数,求解连续因子我就要一个循环了,那么再加上一个个数我也得套在循环里,更何况还有一个起点呢)

        (4)输出格式的限制:我需要先输出最长因子的个数,在输出最长连续因子相乘,乘号有讲究

3、最后编写代码实现;

代码实现:

#include<stdio.h>
#include<math.h>
int main()
{
	int n = 0;
	scanf("%d", &n);
	int i = 0,j=0, a = 0, sum=0,num = 0,temp=0,qidian=0,longqidian=0;
	int x = sqrt(n);//这里解释一下,为什么sqrt(n),因为我们最少的因子就两个为素数,假设这个不是素数,极限求最大的两个值相乘等于该数就是开根号,所以这里是节省运行时间,防止超时
	for (i = 2;i <= x;i++)
	{
		num = 0;
		sum = n;
		qidian = i;
		for (j = i;sum%j==0&&sum!=0;j++)
		{
			sum /= j;
			num++;
		}
		if (num > temp)
		{
			temp = num;//筛选最长因子个数
			longqidian = qidian;
		}
	}
	if (temp == 0)
		printf("1\n%d", n);
	else
	{
		printf("%d\n", temp);
		i = longqidian;
		while (i < longqidian + temp)
		{
			if (i != longqidian)
				printf("*");
			printf("%d", i);
			i++;
		}
	}
	return 0;
}

  • 52
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

许舒雅的宝贝

你的鼓励是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值