题目描述:输入正整数s,打印出所有和为s的连续序列。
解题思路:将正整数序列1-s按照升序排列,分别用small和big指向序列中的最小值和最大值,计算从small至big这一范围内所有值的和。如果计算的和大于s,则将small指针向前移动,即删除此时序列中的最小值;如果经计算的和小于s,则将big指针向后移动,即增大序列的和;直至small指针指到原序列的中间为止。初始化时,small和big指针分别指向序列最小的两个数。
// ConsoleApplication47.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include<iostream> #include<string> using namespace std; void PrintContinuousSequence(int small, int big){ for (int i = small; i <= big; i++){ cout << i << " "; } cout << endl; } void FindSequenceSum(int sum){ if (sum < 3) return; int small = 1; int big = 2; int ssum = small + big; while (small <= (sum / 2) && small<big){ if (ssum <= sum){ if (ssum==sum) PrintContinuousSequence(small, big); big++; ssum += big; } else { ssum -= small; small++; } } } void Test(char* testName, int sum) { if (testName != NULL) printf("%s for %d begins: \n", testName, sum); FindSequenceSum(sum); } int _tmain(int argc, _TCHAR* argv[]) { Test("test1", 1); Test("test2", 3); Test("test3", 4); Test("test4", 9); Test("test5", 15); Test("test6", 100); system("pause"); return 0; }