您的位置:首页 > 职场人生

面试题40:输出和为指定值的连续正数序列

2013-09-05 11:23 288 查看


思路:

1. 用两个变量分别表示序列的最小值和最大值。首先把他们分别初始化为1和2,

2. 如果从最小值到最大值的序列之和大于给定值,则从序列中去掉最小值,也就是增大最小值;

3. 如果从最小值到最大值的序列之和小于给定值,则增大最大值,让序列包含更多的数字

4. 由于序列中至少有两个数字,我们一直增加最小值到(1+给定值)/2为止

代码如下:

#include "stdafx.h"
#include <iostream>
using namespace std;

//打印满足要求的连续正数序列,nSmall和nBig分别表示序列的最小值和最大值
void PrintSequence(int nSmall, int nBig)
{
for (int i=nSmall; i<=nBig; i++)
{
cout << i << " ";
}
cout << endl;
}

void FindContinousSequence(int nSum)
{
if (nSum < 3)
{
return;
}

int nSmall = 1;
int nBig = 2;
int nMid = (nSum + 1) >> 1;
int nCurSum = nSmall + nBig;

while (nSmall < nMid)//循环终止条件
{
if (nCurSum == nSum)
{
PrintSequence(nSmall, nBig);//打印序列
}

while (nCurSum > nSum && nSmall < nMid)//当前和比指定值大
{
nCurSum -= nSmall;//从中减掉最小值
nSmall++;//同时增大最小值
if (nCurSum == nSum)
{
PrintSequence(nSmall, nBig);
}
}

//当前和比指定值小
nBig++;//增大最大值
nCurSum += nBig;//更新当前和
}
}

int _tmain(int argc, _TCHAR* argv[])
{
FindContinousSequence(15);
system("pause");
return 0;
}

运行结果:




内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: