41-找和为sum的连续正数序列

本文介绍了一种算法,用于找出所有和为特定正数的连续正数序列(至少包含两个数)。通过调整序列的起始和结束值,实现对序列长度的动态控制,最终打印出符合条件的所有序列。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、题目描述

输入一个正数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;
    }
}

 

                                                                                                 梦想还是要有的,万一实现了呢~~~~~ヾ(◍°∇°◍)ノ゙~~~~~~~~~~~~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值