标签:c style class blog code tar
题目:输入一个整数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("\n"); } //找到两个数和为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; }
标签:c style class blog code tar
原文地址:http://www.cnblogs.com/mengfanrong/p/3761727.html