面试题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; }
运行结果:
相关文章推荐
- 一道算法面试题 -- 输出所有和为n连续正数序列
- 网易面试题 输入一个正数n,输出所有和为n连续正数序列
- 输入一个正数n,输出所有和为n 连续正数序列
- 剑指offer面试题[41]-和为s的两个数VS和为s的连续正数序列
- 【每日面试题】输入一个正数n,输出所有和为n连续正数序列
- 剑指offer——面试题41:和为s的两个数字VS和为s的连续正数序列
- 面试题41:和为s的两个数字,和为s的连续正数序列
- 【算法学习-01】 输入一个正数 n,输出所有和为 n 连续正数序列。
- 输入一个正数n,输出所有和为n的连续正数序列
- 57、输出和为S的连续正数序列
- 输入一个正数n,输出所有和为n 连续正数序列
- 输入n个元素组成的序列S,你需要找出一个乘积最大的连续子序列。如果这个最大的乘积不是正数,应输出0(表示无解)。1<=18,-10<=Si<=10
- offer40--和为s的连续正数序列
- 【剑指Offer】面试题41:和为s的连续正数序列
- 剑指offer——面试题:42(二)s的连续正数序列
- 输入一个正数n,输出所有和为n连续正数序列。
- 面试题41-题目2:和为S的连续正数序列
- 面试题41(2). 和为S的连续正数序列
- 面试题41(2) 和为s的连续正数序列
- 输入一个正数n,输出所有和为n连续正数序列。例如输入15,由于1+2+3+4+5=4+5+6=7+8=15,所以输出3个连续序列1-5、4-6和7-8。