zoukankan      html  css  js  c++  java
  • 和为n连续正数序列 【微软面试100题 第五十一题】

    题目要求:

      输入一个正数n,输出所有和为n连续正数序列(至少两个)。

      例如输入15,由于1+2+3+4+5 = 4+5+6 = 7+8 = 15.所以输出3个连续序列1~5,4~6,7~8.

      参考资料:剑指offer第41题。

    题目分析:

      由题意可知:从1~n中找连续的整数序列。

      可以用两个变量small和big表示一个区间small~big,再用一个变量sum表示这个区间的数的和如果sum>n,则small向后移,如果sum<n则big向后移,如果sum=n则输出该区间small~big.

    代码实现:

      

    #include <iostream>
    
    using namespace std;
    
    void FindContinuousSequence(int n);
    
    int main(void)
    {
        int n;
        
        cout << "请输入n:";
        
        cin >> n;
        FindContinuousSequence(n);
    
        return 0;
    }
    void Print(int small,int big)
    {
        cout << "连续序列有:";
        for(int i = small;i<=big;i++)
            cout << i << " ";
        cout << endl;
    }
    void FindContinuousSequence(int n)
    {
        //因为至少两个正数,1+2=3,因此如果n<3则不存在连续序列
        if(n<3)
            return;
        int small = 1;
        int big = 2;
        //至少两个数,则最小的数肯定小于mid,作为退出while条件
        int mid = (1+n)/2;
        int curSum = small+big;
        while(small<mid)
        {
            if(curSum==n)
                Print(small,big);
            while(curSum>n && small<mid)
            {
                curSum -= small;
                small++;
                if(curSum==n)
                    Print(small,big);
            }
            big++;
            curSum += big;
        }
    }

      

  • 相关阅读:
    数据结构学习(一)、线性表
    内容太多用省略号代替、内容不换行,鼠标移上去显示详情
    时间格式化
    51Nod--1018排序
    51Nod--1085背包问题
    51Nod--1049最大子段和
    51Nod--1051最大子矩阵和(DP入门)
    POj1852--Ants
    c# static用法
    group by用法
  • 原文地址:https://www.cnblogs.com/tractorman/p/4084155.html
Copyright © 2011-2022 走看看