题目描述:
一个正整数有可能可以被表示为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
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
}
int QuadraticEquation(int nA, int nB, int nC)
{
double dbDeta = Evolution(nA, nB, nC);
if (dbDeta < 0)
{
return -1;
}
int nDeta = static_cast
int nX1 = (-nB + nDeta) / (2 * nA);
int nX2 = (-nB - nDeta) / (2 * nA);
return (nC > 0) ? nX2 : nX1;
}