分解成连续数字的和

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

 思路:从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 ;
}

你可能感兴趣的:(数字)