PTA 天梯赛习题集 L1-006 连续因子

连续因子

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

这题的题意貌似有点表达错误,他要输出最长连续因子个数,然后下一行需要输出的其实就是那个最长连续因子组成的序列。并不是所谓的最小连续因子序列。
这里用暴力穷举处理了这个问题。
1.首先我们得知道求一个数的因子我们不需要一直寻找到那个数,只需要穷举到那个数的根号为止就好了。例如:25,取根号得5。我们只需要穷举到5就好了。因为大于五的话如5 * 6 = 30;这已经超过25了连续因子只能小于5的范围内超出5,不存在那种连续因子。
2.求连续因子,我们得知道连续因子的特点。正如题目给的例子。
630 = 3 x 5 x 6 x 7
630 = 3 x 5 x 42
630 = 3 x 210
不难看出5,6,7不仅是630的因子也是210的因子,6,7也是42的因子。所以我们找630的连续因子的时候可以这么做,先找的有个可以整除630的有个数,然后给这个数加一再试试能不能继续整除。
例如
2可以整除630得315。2+1得3,但是3不是315的因子不能整除,因此不能形成连续因子,继续往下找,
3可以整除630得210。3+1得4,但是4不能整除210,因此不能形成连续因子。
4本身就不能整除630,直接舍弃
5可以整除630得126。5+1得6,6可以整除126得21,6+1得7,7也能整除21得3,7+1得8,8不能整除3结束寻找5开头的连续因子。并记录。
630 = 3 x 7 x 6 x 5
630 = 21 x 6 x 5
630 = 126 x 5
以此类推一直寻找到根号630

AC代码(c语言)

#include<stdio.h>
#include<math.h>

int main(void)
{
	int n;
	scanf("%d", &n);
	int k = sqrt(n) + 1;		/*取根号可能会出现小数点被舍弃的情况
								导致无法枚举出所以情况,加1即可包含所有情况
								避免丢失。*/
	int i, j;
	int max = 0, count = 0, start = 0;
	int temp = n;
	for (i = 2; i < k; i++)
	{
		if (n % i != 0)
			continue;
		temp = n;				//临时存储n的值防止n被改变
		j = i;
		count = 0;
		while (temp % j == 0)	//一直寻找连续因子
		{
			temp /= j;
			j++;
			count++;			//统计
		}
		if (count > max)		//记录最优结果
		{
			max = count;			
			start = i;
		}
		
	}
	if (max == 0)				//特殊处理质数
		printf("1\n%d", n);
	else
	{
		printf("%d\n", max);
		printf("%d", start);	//格式输出
		for (i = start + 1; i < start + max; i++)
			printf("*%d", i);
	}
	return 0;
}
  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值