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

网易面试题:和为n连续正数序列

2014-08-22 19:13 288 查看
题目:

  输入一个正数n,输出所有和为n连续正数序列。例如输入15,由于1+2+3+4+5=4+5+6=7+8=15,所以输出3个连续序列1-5、4-6和7-8。

  继续做些题目,看到这是网易面试题,于是又认认真真自己思考着做了。

解决:

  结果一定是2个相连的数、3个相连的数、4个、5个等等。那么可以把这个数n除以i(i为2,3,4...代表相连的数的个数),得到的这些相邻的数的大概平均值,如当 n = 15、i = 2 时,n / i = 7,这代表如果有两个相邻的数的和是15,那么它们的大概平均值是7;i = 3 时,n / i = 5,代表三个连续的数的大概平均值是5,那么这三个数是4,5,6。大概平均值是因为整数除引起的。所以可以由相连数的个数得到这些数的大概平均值,从而可以得到这么多个相连的数,判断它们的和是否满足,不满足再看下一个相邻数的个数,直到相连数的第一个到了1。

  代码及结果:

#include <iostream>

using std::cin;
using std::cout;
using std::endl;

void hs(int n)
{
if (n <= 1)
return;

for (int ii = 2;; ii++)        // ii 代表结果由几个数字相加
{
int divisionRes = n / ii;            //相当于 ii 个数的平均数
int thisSum = 0;
int pS = divisionRes, pE = divisionRes;            //两个指针
int pLS;        //最左边的一个数

if (ii % 2)            //ii 是奇数
{
thisSum += pS;
pLS = divisionRes - (ii / 2);
}
else      //ii 是偶数
{
pE++;
thisSum += (pS + pE);
pLS = divisionRes - (ii / 2) + 1;
}

if (pLS < 1)
break;

pS--, pE++;        //上面的判断已经计算了最中心的了
while (pS >= pLS)
{
thisSum += (pE + pS);
pS--, pE++;
}

if (thisSum == n)
{
pS++, pE--;
while (pS <= pE)
cout << pS++ << "  ";
cout << endl;
}
}
}

int main(void)
{
int t = 160;
while (t--)
{
int n = rand() % 1000;
cout << n << endl;
hs(n);
cout << "-----------------------------------------------------------------------------\n";
}
cin.get();
}




注意:

  1:奇数个相连的数和偶数个相连的数的统一。

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