1096 Consecutive Factors (20 point(s))

1096 Consecutive Factors (20 point(s))

Among all the factors of a positive integer N, there may exist several consecutive numbers. For example, 630 can be factored as 3×5×6×7, where 5, 6, and 7 are the three consecutive numbers. Now given any positive N, you are supposed to find the maximum number of consecutive factors, and list the smallest sequence of the consecutive factors.

Input Specification:

Each input file contains one test case, which gives the integer N (1<N<2​31​​).

Output Specification:

For each test case, print in the first line the maximum number of consecutive factors. Then in the second line, print the smallest sequence of the consecutive factors in the format factor[1]*factor[2]*...*factor[k], where the factors are listed in increasing order, and 1 is NOT included.

Sample Input:

630

Sample Output:

3
5*6*7

输入一个正整数,求出它的连续最长因子。原本是朝着分解质因数的方面去想,实际上暴力即可,毕竟看分写代码

关于素数问题有一个重要结论,一个数除了1和它本身,不会有大于其平方根的因子。因此本题的思路是,从i=2开始,判断从i开始的连续因子数,如果有更多的因子数量,则更新其长度和开始的数。

关于此题的坑:

最开始循环体是:

for(int i=2;i*i<N;i++){}

 这样的话case#5一直不能通过(19分)。原因是这个case中的N可能很大,使得在循环过程中i*i溢出,因此不能跳出循环,出现TLE。解决方案:a. 改成i<=sqrt(N);b. i和N使用long long。巨坑!

不少前辈的代码首先判断素数,实际上本代码起到了同样的效果,还避免了重复计算。

使用queue:https://www.cnblogs.com/mr-stn/p/9217379.html

#include<iostream>
#include<cmath>
using namespace std;
int main(void){
	int N; cin>>N;
	int ans=0,start;
	int m = sqrt(1.0*N);
	for(int i=2;i<=m;i++){
		int num = N,a = i;
		int len = 0;
		while(num>=a&&num%a==0){
			num/=a;
			len++;a++;
		}
		if(len>ans){
			ans=len;start=i;
		}
	}
	if(ans==0) cout<<"1"<<endl<<N<<endl;
	else{
		cout<<ans<<endl;
		for(int i=start;i<start+ans;i++){
			if(i==start) cout<<i;
			else cout<<"*"<<i;
		}
		cout<<endl;
	} 
	return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值