zoukankan      html  css  js  c++  java
  • 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;
    }
    


  • 相关阅读:
    Android studio怎么创建shape的XML文件
    请问如何在PS中将一张图标里的各个小图标分离成一个个图标?
    IOS 开发之 -- 过滤掉字符串里面所有的非法字符 字典和json之间的互转
    ios开发之 -- 5分钟集成融云的客服功能
    ios开发之 --调用系统的页面,显示中文
    IOS 开发之-- textfield和textview,return键的改变,点击return键
    IOS 开发之--获取真机的deviceToeken
    iOS 开发之--使用AFNetWorking3.1.0上传单张/多张图片
    iOS 开发之--打测试包的时候报错的解决方法
    ios开发之 -- 调用系统定位获取当前经纬度与地理信息
  • 原文地址:https://www.cnblogs.com/wgwyanfs/p/7084497.html
Copyright © 2011-2022 走看看