51 和為n連續正數序列

2021-06-26 03:07:28 字數 1066 閱讀 4996

51.和為 n 連續正數序列。

題目:輸入乙個正數 n,輸出所有和為 n  連續正數序列。

例如輸入 15,由於 1+2+3+4+5=4+5+6=7+8=15,所以輸出3個連續序列1-5、4-6和7-8。

/*51.和為 n 連續正數序列。

題目:輸入乙個正數 n,輸出所有和為 n 連續正數序列。

例如輸入 15,由於 1+2+3+4+5=4+5+6=7+8=15,所以輸出3個連續序列1-5、4-6和7-8。

方法1:可用兩個數small和big分別表示序列的最小值和最大值。

首先把small初始化為1,big初始化為2。

如果從small到big的序列的和大於n的話,我們向右移動small,相當於從序列中去掉較小的數字。

如果從small到big的序列的和小於n的話,我們向右移動big,相當於向序列中新增big的下乙個數字。

一直到small等於(1+n)/2,因為序列至少要有兩個數字。

但是對於n比較大的 是不切實際的。

方法2假設:n=i+(i+1)+...+(j-1)+j, 所以: n = (i+j)(j-i+1)/2 = (j*j-i*i+i+j)/2

=> j^2+j+(i-i^2-2n)=0 => j=sqrt(i^2-i+1/4+2n)-1/2

1<=i#include#includeusing namespace std;

void findconsecutivesequence2(int n) {

for (int i=1;i<=n/2;i++)

{ double j2=sqrt(4*i*i+8*n-4*i+1)-1;//求出是2j

if (j2==0) continue;

if ((j2-int(j2))==0)//如果2j是整數

{for(int k=i;k<=j2/2;k++)

printf("%d ",k);

cout{ nsum-=nsmall;

nsmall++;

if(nsum==n)

{for(int i=nsmall;i<= nbig;i++)

{cout<

和為n連續正數序列

51.和為n連續正數序列。題目 輸入乙個正數n,輸出所有和為n連續正數序列。例如輸入15,由於1 2 3 4 5 4 5 6 7 8 15,所以輸出3個連續序列1 5 4 6和7 8。分析 這是網易的一道面試題。這個題目出自微軟等資料結構 演算法面試100題 在devc 中編譯通過 name aut...

和為n連續正數序列

題目 輸入乙個正數n,輸出所有和為n連續正數序列。例如輸入15,由於1 2 3 4 5 4 5 6 7 8 15,所以輸出3 個連續序列1 5 4 6 和7 8。思路 既然是連續正整數,則可以將其看成是等差數列,公差d 1 等差數列前n項求和公式為sn na1 n n 1 d 2,其中sn為使用者輸...

和為 n 連續正數序列

題目 輸入乙個正數 n,輸出所有和為 n 連續正數序列。例如輸入 15,由於 1 2 3 4 5 4 5 6 7 8 15,所以輸出 3 個連續序列 1 5 4 6 和 7 8。思路 我們再找連續的序列,那麼我們從最小的一直往前加,如果和結果相等,那麼這是乙個符合條件的序列,然後再連續的往後加,如果...