1096. Consecutive Factors (20)

题目如下:

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<231).

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



题目要求找出一个正整数的最长最小连乘子列,注意到长度的优先级大于数字的大小,例如对于题目给出的630,能找到的最小子列是5*6*7,而对于633,能找到的则是2(另一个是211,2<211且长度均为1,故选择2)。

一个直接的思路就是从2开始,以这个数为开头,依次向后乘,即用原数每次除以后面的一个数,直到不能整除或者被除数为0,这时候开头和最后处理的这个数之前一个数就构成了连乘子列的头尾,比较这个子列的长短和之前找到的最长的长度关系,如果比原来长,则更新记录的子列头尾。否则继续从3,4,5,....处理每个数开头的子列。

从上面的分析可以看出,这是一个双层循环,时间复杂度较高,为了降低时间复杂度,我们下面用一个结论:

一个正整数a不可能被比根号a大的数整除。

因此我们可以让外层循环从2到根号a,从而降低时间复杂度。

这个算法我比较完整的参考了zju小R的算法,下面是他的代码

/*2015.7.31cyq*/
#include <iostream>
#include <math.h>
using namespace std;

int main(){
	int n;
	cin>>n;
	int m=sqrt((double)n);
	int maxCount=0;
	int first=n;
	for(int i=2;i<=m;i++){
		int count=0;
		int start=i;
		int tmp=n;
		while(tmp%start==0){
			count++;
			tmp=tmp/start;
			start++;//一旦找到可以整除的i就缩小n并检测i+1
		}
		if(start-i>maxCount){
			maxCount=start-i;
			first=i;
		}
	}
	if(maxCount==0){//n只能被自己和1整除
		cout<<1<<endl;
		cout<<n;
		return 0;
	}
	cout<<maxCount<<endl;
	cout<<first;
	for(int i=1;i<maxCount;i++)
		cout<<"*"<<first+i;
	return 0;
}


转载于:https://www.cnblogs.com/aiwz/p/6154048.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值