タイトル説明
暁明は、彼が計算するのに必要と9〜16は、彼はすぐに正しい答えは100で書いた、数学の宿題をやっていた、数学、1日の非常に好きです。彼はこれに満足していなかった。しかし、彼は(少なくとも二つの数字を含む)100がどのように多くの連続した正数列の種類疑問に思いました。18,19,20,21,22:長い前に、彼は連続した正の数と100のシーケンスの別のセットを得ました。今、あなたの質問は、あなたもすぐにすべての正と連続シーケンスS?幸運を識別することができます!
出力説明:
すべての正の出力と連続数列S. 開始昇順に従ってシーケンス番号との間の昇順で昇順
ソリューション:
法律を見つけるための第一の方法は、
最初のNUM、NUMを開始しました+ n個形成される配列と==合計に
あなたはこれらすべてのマイナスの数(NUM-1)はシーケンス1,2,3,4,5を構成するでしょう何の後,,,, N、およびそれらの和がN *(N + 1)/ IS 2
シーケンスの条件が満足する満足する:N *(NUM-1) + N *(N + 1)/ 2 ==和
第二の方法は、スライディングウィンドウ
スライディングウィンドウを使用して、大きな、右に左ポインタ、及び右番号と数、左、及び小、右に右ポインタを吐き出します
1 // 第一法則発見する方法、 2 // で構成NUM回目のスタートを、シーケンスNUM + N ==合計 3 // あなたは(NUM-1)を減算することにより、これらの数字のすべてがシーケンスを構成していることがわかりますどのような1,2,3,4,5 ,,,, N、およびそれらの和* N-(N + 1)/ 2である 4。 // 配列の条件が満足する満足する:N *(NUM-1) + N * (N + 1)/ 2 == SUM 5。 クラスSolution01 { 6。 公共: 7 ベクトル<ベクトル< INT >> FindContinuousSequence(int型SUM){ 8 ベクトル<ベクトル< INT >> RES; 9。 ため(INT I = 1 ; Iは<SUM; ++ I) 10 { 11。 INTのシータ=(2 * I - 1)*(2 * I - 1)+ 8 * 和。 12 INT GEN = SQRT(シータ)。 13 もし(!GEN * GEN =シータ)は継続。 14 int型 A =(1 - 2 * I)+ GEN。 15 であれば(%2!= 0)続けます。 16 ベクトル< int型 > TEMP。 17 のための(int型 J = 0; J </ 2 ; ++ J) 18がある temp.push_back(私は+ J)を、 19 res.push_back(TEMP); 20である } 21れる リターンRES; 22である } 23れる }; 24 25 // 第二の方法、スライドウィンドウ 26 @ スライディングウィンドウを使用して、大きな、右、左、右数と結合放電の数、及び小、右および右ポインタ、左ポインタ 27 クラスソリューション{ 28 公共: 29 ベクトル<ベクトル< INT >> FindContinuousSequence(int型SUM){ 30 IF(SUM < 3)リターン{}。 31 ベクトル<ベクトル< 整数 >> RES。 32 INTは L = 1、R = 2、S = 1 + 2 。 33 一方(L <R && R < 和){ 34 であれば(S == 合計){ 35 ベクター< INT > TEMP。 36 のために(INT J = L; J <= R; ++ j)は 37 temp.push_back(J)。 38 res.push_back(TEMP)。 39 } 40 場合(S> = 合計){ 41の S - = L。 42 ++ L; 43 } 44 他{ 45 ++ R。 46の S + = R。 47 } 48 } 49の リターンRES。 50 } 51 }。