• 26.打印所有和为S的连续正整数序列[FindContinuousSequencesWithSumS]


    【题目】

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

    【分析】

    这是网易的一道面试题。这道题和本面试题系列的第10题有些类似。我们用两个数small和big分别表示序列的最小值和最大值。首先把small初始化为1,big初始化为2。如果从small到big的序列的和大于n的话,我们向右移动small,相当于从序列中去掉较小的数字。如果从small到big的序列的和小于n的话,我们向右移动big,相当于向序列中添加big的下一个数字。一直到small等于(1+n)/2,因为序列至少要有两个数字。

    【代码】

     C++ Code 
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
     

    /////////////////////////////////////////////////////////////////////////
    // Print continuous sequence between small and big
    /////////////////////////////////////////////////////////////////////////
    void PrintContinuousSequence(int small, int big)
    {
        
    for(int i = small; i <= big; ++ i)
            printf(
    "%d ", i);

        printf(
    " ");
    }

    /////////////////////////////////////////////////////////////////////////
    // Find continuous sequence, whose sum is n
    /////////////////////////////////////////////////////////////////////////
    void FindContinuousSequence(int n)
    {
        
    if(n < 3)
            
    return;

        
    int small = 1;
        
    int big = 2;
        
    int middle = (1 + n) / 2;
        
    int sum = small + big;

        
    while(small < middle)
        {
            
    // we are lucky and find the sequence
            if(sum == n)
                PrintContinuousSequence(small, big);

            
    // if the current sum is greater than n,
            // move small forward
            while(sum > n && small < middle)
            {
                sum -= small;
                small ++;

                
    // we are lucky and find the sequence
                if(sum == n)
                    PrintContinuousSequence(small, big);
            }

            
    // move big forward
            big ++;
            sum += big;
        }
    }

    【参考】

    http://zhedahht.blog.163.com/blog/static/25411174200732711051101

    个人学习笔记,欢迎拍砖!---by hellogiser

    Author: hellogiser
    Warning: 本文版权归作者和博客园共有,欢迎转载,但请保留此段声明,且在文章页面明显位置给出原文连接。Thanks!
    Me: 如果觉得本文对你有帮助的话,那么【推荐】给大家吧,希望今后能够为大家带来更好的技术文章!敬请【关注】
  • 相关阅读:
    三次握手四次挥手
    OSI七层模型和TCP/IP协议族
    CSS水平垂直居中方式
    CSS9种水平居中方式
    CSS8种垂直居中方式
    scss 初学笔记 二 混合宏
    scss 初学笔记 一 变量声明 默认的样式 嵌套
    面向对象的程序设计之对象
    underscore.js 源码阅读 一 整体结构
    underscore.js 源码阅读 准备
  • 原文地址:https://www.cnblogs.com/hellogiser/p/3738826.html
Copyright © 2020-2023  润新知