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


  • 相关阅读:
    主动找智能钥匙 PKE取代RKE是大势所趋
    OBD-II Protocol -- SAE J1850 VPW PWM
    STM32F4: GENERATING A SINE WAVE
    Using PWM Output as a Digital-to-Analog Converter
    Spartan-6
    MAX II Device Compatibility with 5.0-V CMOS Devices
    ARM FPGA Extended Memory Interface
    STM32 100 pin 多个外设译码方案
    SILICA Xynergy-M4 Board -- STM32F417 meets XILINX Spartan-6
    Xilinx Platform Usb Cable
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/3761727.html
Copyright © 2011-2022 走看看