思路:
1.用兩個變數分別表示序列的最小值和最大值
。首先把他們分別初始化為1和2,
2.如果從最小值到最大值的序列之和大於
給定值,則從序列中去掉最小值,也就是增大最小值;
3.如果從最小值到最大值的序列之和小於
給定值,則增大最大值,讓序列包含更多的數字
4.由於序列中至少有兩個數字,我們一直增加最小值到(1+給定值)/2為止。
**如下:
#include "stdafx.h"
#include using namespace std;
//列印滿足要求的連續正數序列,nsmall和nbig分別表示序列的最小值和最大值
void printsequence(int nsmall, int nbig)
cout << endl;
}void findcontinoussequence(int nsum)
int nsmall = 1;
int nbig = 2;
int nmid = (nsum + 1) >> 1;
int ncursum = nsmall + nbig;
while (nsmall < nmid)//迴圈終止條件
while (ncursum > nsum && nsmall < nmid)//當前和比指定值大
}//當前和比指定值小
nbig++;//增大最大值
ncursum += nbig;//更新當前和
} }int _tmain(int argc, _tchar* argv)
執行結果:
和為指定值的連續序列
輸入乙個整數s,列印出所有和為s的連續正整數序列 至少包含兩個數 例如,對於輸入15,由於有1 2 3 4 5 15,4 5 6 15,7 8 15,所以列印出1 5 4 6 7 8三個序列。有個比較好的做法是利用等差數列求和公式 s a n n n 1 2。這裡的a是第乙個元素,n是項數。int ...
面試題 和為 n 連續正數序列
題目 輸入乙個正數 n,輸出所有和為 n連續正數序列。例如輸入 15,由於 1 2 3 4 5 4 5 6 7 8 15,所以輸出 3 個連續序列 1 5 4 6和 7 8。方法一 首先判斷n最多能由幾個連續數的和得到,假設最多由m個連續數和得到,那麼m m 1 2 n這樣很容易求得 m sqrt ...
面試題 和為s的連續正數序列
輸入乙個正數s,列印出所有和為s的連續正數序列 至少含有兩個數 例如,輸入15,由於1 2 3 4 5 4 5 6 7 8 15,所以列印出3個連續序列1 5 4 6和7 8。思路 依舊雙指標套路 void findcontinuoussequence int sum if sum 3 return...