面試題57(二):為s的連續正數序列
阿新 • • 發佈:2018-12-16
一、題目
輸入一個正數s,打印出所有和為s的連續正數序列(至少含有兩個數)。例如輸入15,由於1+2+3+4+5=4+5+6=7+8=15,所以結果打印出3個連續序列1~5、4~6和7~8。
二、關鍵
1.兩個指標。
三、解釋
1.
2.疑惑:為什麼small只需要小於(1+S)/2即可?因為序列是從1,2,到S。
四、程式碼
#include <cstdio> void PrintContinuousSequence(int small, int big); void FindContinuousSequence(int sum) { if(sum < 3) return; int small = 1; int big = 2; int middle = (1 + sum) / 2; int curSum = small + big; while(small < middle) { if(curSum == sum) PrintContinuousSequence(small, big); while(curSum > sum && small < middle) { curSum -= small; small ++; if(curSum == sum) PrintContinuousSequence(small, big); } big ++; curSum += big; } } void PrintContinuousSequence(int small, int big) { for(int i = small; i <= big; ++ i) printf("%d ", i); printf("\n"); } // ====================測試程式碼==================== void Test(const char* testName, int sum) { if(testName != nullptr) printf("%s for %d begins: \n", testName, sum); FindContinuousSequence(sum); } int main(int argc, char* argv[]) { Test("test1", 1); Test("test2", 3); Test("test3", 4); Test("test4", 9); Test("test5", 15); Test("test6", 100); return 0; }