网易面试题:和为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。
代码及结果:
注意:
1:奇数个相连的数和偶数个相连的数的统一。
2:相连的数边界的处理。
输入一个正数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:相连的数边界的处理。
相关文章推荐
- 【网易面试题】和为n的连续正数序列
- 40. 网易面试题:和为n连续正数序列(数组)
- 网易面试题 输入一个正数n,输出所有和为n连续正数序列
- 剑指offer 面试题41 和为 s 的两个数字 VS 和为 s 的连续正数序列
- 面试题41:和为s的两个数字VS和为s的连续正数序列
- (剑指Offer)面试题41:和为s的连续正数序列
- 剑指offer——面试题41:和为s的两个数字VS和为s的连续正数序列
- 【剑指Offer】面试题41:和为s的连续正数序列
- 面试题41 和为S的连续正数序列
- 面试题45:和为s的两个数字VS和为s的连续正数序列
- 剑指offer——面试题:42(二)s的连续正数序列
- 程序员面试题精选100题(26)-和为n连续正数序列
- 面试题-和为 n 连续正数序列
- 面试题41:和为s的两个数字VS和为s的连续正数序列
- 微软,Google面试题 (26) —— 和为n连续正数序列
- 面试题41和为S的两个数字VS和为s的连续正数序列
- 剑指Offer_面试题41_和为s的两个数字 VS 和为s的连续正数序列
- 剑指offer-面试题41:和为s的两个数字VS和为s的连续正数序列
- 网易面试题:求连续几个自然数之和为S的序列
- [剑指offer][面试题41]和为s的两个数字 VS 和为s的连续正数序列