将正整数拆分为连续的自然数之和

#include <iostream>

using namespace std;

//思想:
//如果a被一个奇数b整除,则它可以拆分成以a/b为中间数的连续的b个连续整数数之和;
//如果a模一个偶数b的余数正好等于b/2,那么a可以分解为以a/b,a/b+1为两个中间数的b个连续整数之和。
 int intCheck(int n)
{
    for(int i=2; i < n; i++)
    {
        int mod = n%i;
        if(mod==0 && i%2==1)
            {
                //得到拆分的最小正整数和最大正整数
                int start = n/i - (i-1)/2;
                int endd = start + i -1;
                //保证分解的最小整数是正数
                if(start <=0)
                    continue;
                cout << n << "=";
                for( ;start < endd;start++)
                {
                    cout << start << "+";
                }
                cout <<endd <<endl;
            }
            else if(mod*2 == i)
            {
                //得到拆分的最小正整数和最大正整数
                int start = n/i-i/2+1;
                int endd = n/i+i/2;
                //保证分解的最小整数是正数
                if(start <=0)
                    continue;
                cout << n << "=";
                for( ;start < endd;start++)
                {
                    cout << start << "+";
                }
                cout <<endd <<endl;
            }
            else
                continue;
        }
        return 0;
    }

int main()
{
   int n = 0;
   cin >> n;
   intCheck(n);
   return 0;
}

 

 

posted @ 2013-08-27 17:49  倚天照花海  阅读(595)  评论(0)    收藏  举报