一、題目描述
輸入一個正數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;
}
}
夢想還是要有的,萬一實現了呢~~~~~ヾ(◍°∇°◍)ノ゙~~~~~~~~~~~~