题目如下:
最优分解
把正整数N分解成若干个互不相同的正整数的和,且使这些自然数的乘积最大。请你编写一个程序,由键盘输入N(3≤N≤1000),求满足条件的分解方案。例如,输入10,则输出2,3,5。其乘积为30。
我的代码如下:
#include <iostream>
#include <cmath>
#include <cstdlib>
int main()
{
int i,j,k,mid,num = 1;
std::cout<<"Please enter a number:/n";
std::cin>>i;
j = sqrt(i);//得到要分解的个数
int *a = new int[j];//分配一个一维数组用来存放数据
if(j%2)
{//如果平方根的取整是奇数
mid = int(i/j);
a[j/2] = mid;
a[j-1] = i-mid;
for(k = j/2-1;k >= 0;k--)
{
a[k] = a[k+1] - 1;
a[j-1] -= a[k];
}
for(k = j/2+1;k <j-1;k++)
{
a[k] = a[k-1] + 1;
a[j-1] -= a[k];
}
}
else
{//如果平方根的取整是偶数
if(i%2)
{//输入数据是偶数时
mid = i/(j/2);
if(mid%2)
{//中间值是奇数
a[j/2-1] = mid / 2;
a[j/2] = mid/2 + 2;
std::cout<<a[j/2]<<std::endl;
}
else
{//中间值是偶数
a[j/2-1] = mid/2;
a[j/2] = mid/2 + 1;
}
for(k = j/2+1;k <j;k++)
{
a[k] = a[k-1]+1;
}
for(k = j/2-2;k >= 0;k--)
{
a[k] = mid - a[j-1-k];
}
}
else
{//输入数据是奇数时
mid = i/(j/2);
if(mid%2)
{//中间值是奇数
a[j/2-1] = mid / 2;
a[j/2] = mid/2 + 1;
std::cout<<a[j/2]<<std::endl;
}
else
{//中间值是偶数
a[j/2-1] = mid/2 - 1;
a[j/2] = mid/2 + 1;
}
for(k = j/2+1;k <j;k++)
{
a[k] = a[k-1]+1;
}
for(k = j/2-2;k >= 0;k--)
{
a[k] = mid - a[j-1-k];
}
}
}
std::cout<<i<<" should be break into "<<j<<" numbers for the biggest!/n";
for(k = 0;k < j;k++)
{
num *= a[k];
std::cout<<a[k]<<std::endl;
}
std::cout<<num<<" is the biggest!/n";
delete a;
return 0;
}
最后的输出乘积没有进行处理,当超出int的值的时候就会随机出现一个值。