41-找和爲sum的連續正數序列

一、題目描述

輸入一個正數sum,打印出所有和爲sum的連續正數序列(至少含有兩個數),例如輸入15,由於1+2+3+4+5=4+5+6=7+8,所以結果打印出三個連續序列1~5、4~6和7~8

二、解題思路

該題的特殊點在於,找的是一個遞增的連續序列,基本思路如下:
1)設定兩個參數small和big用於分別表示最小值和最大值,根據題目的特點,將small初始化爲1,big初始化爲2
2)將small與big求和,和值與sum值做比較
    a)如果small+big<sum big增加1,small不變 -- 序列變長
    b)如果small+big>sum small增加1,big不變 -- 序列變短
    c)如果small+big==sum 打印序列,同時big增加1,small不變  -- 重複a)和b)操作
注意這裏的連續正數序列要求至少含有兩個數,代碼中需要對這個條件做個限制

三、解題算法

/******************************************************
author:tmw
date:2018-8-7
******************************************************/
#include <stdio.h>
#include <stdlib.h>

/**打印序列參數
* @param small
* @param big
**/
void printSequences(int small, int big)
{
    int i;
    for( i=small; i<big; i++ )
        printf("%d ",i);
    printf("\n");
}

/**找到和爲sum的連續正數序列
* @param sum
**/
void findContinueSequenceEqualToSum(int sum)
{
    /**入參判斷**/
    if( sum < 3 ) return;

    int small = 1;
    int big = 2;
    int cur_sum = small+big;
    int middle = (sum+1)/2; /**用於控制序列至少含有兩個數**/

    while( small < middle )
    {
        /**如果small+big==sum 打印序列,同時big增加1,small不變**/
        if( cur_sum == sum )
            printSequences( small, big );

        while( cur_sum > sum && small < middle )
        {
            cur_sum = cur_sum - small;
            small++;

            /**有可能出現small+big==sum的情況,及時獲取並打印**/
            if( cur_sum == sum )
                printSequences( small, big );
        }
        /**此時的情況是small+big<sum**/
        big++;
        cur_sum = cur_sum + big;
    }
}

 

                                                                                                 夢想還是要有的,萬一實現了呢~~~~~ヾ(◍°∇°◍)ノ゙~~~~~~~~~~~~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章