主要思路:
定义两个数从1,2开始增长,求这两个数之间所有数的和,如果等于S则打印输出,如果大于则让小的数增长,否则让大的数增长,增长后重现判断和是否等于S,在循环中执行直到小的数大于等于(1+S)/2。用到了一个小小的技巧,就是求两个数中间的数之和时,保存了上一次的值,新的值只需要减去小的数,或者加上大的数即可。
以下代码在VS2015中调试通过:
#include "stdafx.h"
#include<iostream>
using namespace std;
void PrintContinuousSequence(int small, int big)
{
printf("the nums is:\n");
for (int j = small; j <= big; ++j)
{
printf("%d ", j);
}
printf("\n");
}
bool FindContinuousSequence(int sum)
{
if (sum<3)
return false;
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;
}
return true;
}
int main()
{
int sum = 0;
cin >> sum;
if (!(FindContinuousSequence(sum)))
printf("can't find!");
while (1);
return 0;
}
该博客介绍了一种算法,用于找出所有和为给定正整数S的连续正数序列。通过从1和2开始,动态调整序列两端的数字,判断序列之和与S的关系,直至找到符合条件的序列或小数超过(1+S)/2。提供了一个C++实现的代码示例。
654

被折叠的 条评论
为什么被折叠?



