PAT-A-1096 Consecutive Factors (20 分)最长连续因子 C++题解

举报
楚楚冻人玥玥仙女 发表于 2021/11/19 00:52:24 2021/11/19
1.4k+ 1 1
【摘要】 1096 Consecutive Factors (20 分) 题目传送门:1096 Consecutive Factors (20 分) 一、题目大意 给定一个数整数n,求n分解成多个因子相乘后,...

1096 Consecutive Factors (20 分)

题目传送门:1096 Consecutive Factors (20 分)

一、题目大意

给定一个数整数n,求n分解成多个因子相乘后,包含最长的连续因子的个数。
如果包含最长连续因为个数的解有多个,则输出最小的一组解。

二、解题思路

刚开始想歪了,我居然打表打出了12!内的连续整数成绩的种类和对应的数量,这样其实是错的,因为这个连续区间最多是【1,12】,然而,居然还能过5组数据,呵呵?只能说数据量太小了。

然后我就改了写法,就是直接实时判断,不预先打表。就是遍历n的每一个因子,然后判断以这个因为为连续序列的头一个数字,那么这个连续序列有多长。通过打擂台存储最长的连续序列即可。想要存储一个连续序列,只需要存第一个数字和序列的长度即可。

注意:此时遍历n的因子时,for的条件控制部分不能写成i*i<=n, 因为n过大时,i达到sqrt(n)+1的时候,i*i超过了int的范围,变成了负数,那i*i<=n依旧成立,造成死循环,结果就是在最后一组数据时运行超时。这里将i*i<=n改成i<=sqrt(n)即可。

三、AC代码

#include<bits/stdc++.h>
using namespace std;
int main(){
	int n;
	cin >> n;
	int max = 0, m = sqrt(n);// 注意此时m = sqrt(n)
	pair<int, int>res;
	for(int i = 2; i <= m; i++){// 如果此时写成i*i<=n,则最后一组数据无法通过,因为两个刚好大于sqrt(n)的值相乘超过了int范围,变成了负数,还能符合i*i<=n,造成了死循环,所以运行超时。
		if(n % i == 0){// i 为因子
			int a = n, b = i;// 从i开始,看连续的因子能有多长
			while(a % b == 0){
				a/=b;
				b++;
			}
			if(b - i > max){ // 是否能更新长度和结果
				max = b - i;
				res = {i, max};
			}
		}
	}
	if(!max){
		cout << 1 << endl << n << endl;
		return 0;
	}
	cout << max << endl;
	cout << res.first;
	for(int i = 1; i < res.second; i++){
		cout << "*" << res.first+i;
	}
	cout << endl;
}

  
 

文章来源: blog.csdn.net,作者:爱玲姐姐,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/jal517486222/article/details/100550483

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

作者其他文章

评论(1

抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。