一、题目描述
输入一个正数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;
}
}
梦想还是要有的,万一实现了呢~~~~~ヾ(◍°∇°◍)ノ゙~~~~~~~~~~~~