一个正整数有可能可以被表示为n(n>=2)个连续正整数之和--算法求解

题目描述:

一个正整数有可能可以被表示为n(n>=2)个连续正整数之和,如: 

15=1+2+3+4+5 
15=4+5+6 
15=7+8
请编写程序,根据输入的任何一个正整数,找出符合这种要求的所有连续正整数序列。 
输入数据:一个正整数,以命令行参数的形式提供给程序。

 

程序:

环境vs2005

#include "stdafx.h"
#include
#include
using namespace std;

// 循环下限
int GetDownValue(int nIn);
// 循环上限
int GetUpValue(int nIn);
// 求开方值
double Evolution(int nA, int nB, int nC);
// 求开方值
int QuadraticEquation(int nA, int nB, int nC);

/************************************************************************
* 求解原理
* 等差序列求和公式
* 一元二次方程求解
* 时间:20081223
************************************************************************/
int _tmain(int argc, _TCHAR* argv[])
{
 int nIn;
 cout<<"Please input the number( >= 2): ";
 while (cin>>nIn)
 {
  if (nIn< 2)
  {
   cout<<"Please input the number( >= 2): ";
   continue;
  }

  bool bFind = false;
  int nDownValue = GetDownValue(nIn);
  int nUpValue = GetUpValue(nIn);
  for (int i = nUpValue; i >= nDownValue; i--)
  {
   double dbDeta = Evolution(1, -(2 * i + 1), 2 * nIn);
   int nDeta = static_cast(dbDeta);
   if (dbDeta - nDeta > 1.0e-6)
   {
    continue;
   }

   int nCross = QuadraticEquation(1, -(2 * i + 1), 2 * nIn);
   for (int k = 0; k < nCross; k++)
   {
    int nOut = i - nCross + 1 + k;
    cout<   }

   if (nCross > 0)
   {
    bFind = true;
    cout<   }
  }
  if (!bFind)
  {
   cout<<"none"<  }
  cout<<"Please input the number( >= 2): ";
 }

 return 0;
}

int GetDownValue(int nIn)
{
 return QuadraticEquation(1, 1, -2 * nIn);
}

int GetUpValue(int nIn)
{
 return (nIn % 2) ? (nIn / 2 + 1) : (nIn / 2);
}

double Evolution(int nA, int nB, int nC)
{
 int nEvoValue = nB * nB - 4 * nA * nC;

 if (nEvoValue < 0)
 {
  return -1;
 }

 return sqrt(static_cast(nEvoValue));
}

int QuadraticEquation(int nA, int nB, int nC)
{
 double dbDeta = Evolution(nA, nB, nC);
 if (dbDeta < 0)
 {
  return -1;
 }

 int nDeta = static_cast(dbDeta);
 int nX1 = (-nB + nDeta) / (2 * nA);
 int nX2 = (-nB - nDeta) / (2 * nA);

 return (nC > 0) ? nX2 : nX1;
}

你可能感兴趣的:(一个正整数有可能可以被表示为n(n>=2)个连续正整数之和--算法求解)