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;
    }
    


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

  • 相关阅读:
    Testlink1.9.17使用方法( 第三章 初始配置[配置用户、产品] )
    Testlink1.9.17使用方法(第二章 登录&汉化设置)
    Testlink1.9.17使用方法(第一章 前言)
    TestLink-Windows安装教程
    Linux-Redmine安装方法
    怎么使用Fiddler进行抓包
    配置ADB到Windows环境变量
    Android获取定位权限,获取设备所在的经纬度
    Paint.FontMetrics
    Bitmap上下合成图片
  • 原文地址:https://www.cnblogs.com/blfshiye/p/4833484.html
Copyright © 2011-2022 走看看