zoukankan      html  css  js  c++  java
  • 【6】和作为连续序列s

    称号:输入一个整数s,并打印出所有s整数的连续序列(含有至少2的数量)。

    如输入9,输出2、3、4和4、5两个序列


    方案一:因为序列至少要2个数,则两个数上限值为(1+s)/2,我们能够枚举该序列的起点和终点求全部满足的序列。时间复杂度为O(n^2),效率比較低

    方案二:我们设置两个指针start和end分别表示当前序列的起点和终点,并记序列和为sum。

    当sum = s的时候输出这个序列,而且end往后移动一位;假设sum > s,则start往后移动一位。假设sum < s,则end要往后移动一位。

                  直到start == (1+s)/2结束循环,时间复杂度O(n)。效率非常高


    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    
    //打印序列
    void PrintNum(int start, int end){
    	for(int i = start; i <= end; i++){
    	    printf("%d ", i);
    	}
    	printf("
    ");
    }
    
    //找到两个数和为s
    void FindSequenceSum(int s){
    	if(s < 3){ //和小于3是不合法的数据
    	    return;
    	}
    	int start = 1;
    	int end = 2;
    	int sum = 3;
    	int mid = (1+s)>>1;
    	//循环找到全部的序列
    	while(start < mid){ //序列的起点要小于(1+s)的一半
    		if(sum == s){ //和为sum的序列直接打印
    		    PrintNum(start, end);
    		    end++;
    		    sum += end;
    		}
    		else if(sum > s){ //和大于s的序列则起始点往后移动一个
    		    sum -= start;
    		    start++;
    		}
    		else{ //和小于s的序列则终点往后移动一位
    		    end++; 
    		    sum += end;
    		}
    	}
    }
    
    int main(){
    	FindSequenceSum(9);
    	getchar();
    	return 0;
    }
    


    版权声明:本文博主原创文章。博客,未经同意不得转载。

  • 相关阅读:
    lists 函数整理
    orddict 练习
    github 的使用
    wxListCtrl 例子 二
    Erlang eunit
    Erlang 中 Tuple 使用 以及 List 模块意外
    Erlang Json
    模块和包
    Mysql作为zabbix数据库ibdata1文件太高解决
    用户管理和数据库安全
  • 原文地址:https://www.cnblogs.com/blfshiye/p/4833484.html
Copyright © 2011-2022 走看看