分解成连续数字的和

输入一个正整数,若该数能用几个连续正整数之和表示,则输出所有可能的正整数序列

 思路:从1开始逐个累加,如果超过n,匹配失败,去除最小的元素,如果不足继续累加下一个,直至相等。

#include <stdio.h>
#include 
<stdlib.h>

int calc(int n)
{
    
int lastnum;
    
int sum;
    
int count;
    
int flag = 1;

    lastnum 
= sum = count = 0;

    
int i = 0;
    
while (count >= 0 && lastnum <= n/2 + 1) {
        
if (sum < n) {    
            lastnum
++;
            printf(
"add %d to sum\n", lastnum);
            count
++;
            sum 
+= lastnum;
        }
else if (sum == n) {    // find a match
            printf("   *** match %d from %d to %d\n",
                    n, lastnum 
- count + 1, lastnum);
            sum 
-= (lastnum - count + 1);
            count
--;
            flag 
= 0;
        }
else if (sum > n) {    
            printf(
"reduce %d\n", lastnum - count + 1);
            sum 
-= (lastnum - count + 1);
            count
--;
        }
    }

    
if ( flag )
        printf(
"No matched for %d\n", n);

    
return 0;
}

int main(int argc, int *argv)
{
//    int n = 8;
    int n = 15;

    calc(n);
    
return 0;
}
原文地址:https://www.cnblogs.com/faraway/p/1391154.html