您的位置:首页 > 其它

对一个小问题的算法思考

2009-05-05 08:50 253 查看
/********************************************************************
*  问题描述:
* 程序设计题5:题目:有一个整数n,将n分解成若干个整数之和,
* 问如何分解能使这些数的乘积最大,输出这个乘积m。
* 例如:n=12
* (1)分解为1+1+1+…+1,12个1, m=1*1*1……*1=12
* (2)分解为2+2+…+2,6个2, m=26=64
* (3)分解为3+3+3+3,4个3, m=34=81
* (4)分解为4+4+4,3个4, m=43=64
* (5)分解为6+6,2个6, m=62=36
* (6)分解为5+7, m=5*7=35
* (7)分解为4+8, m=4*8=32
* 显然,3最好。
*********************************************************************/

/********************************************************************
*  描述:解决拆分乘积最大化问题
* 备注:此问题和已知边长固定的矩形求取面积最大化问题(二次划分),
* 以及已知边长固定求取体积最大化问题(三次划分),依次类推,到N
* 次划分的数学模型一样。经过推理论证可知,当划分的越是平均其

* 最终乘积结果是最大,在各个最大的结果的划分中选择一个最大的

* 组合即为最终结果。还有些细节,在数学上我没有完全进行证明。

*********************************************************************/

/*************************************** *****************************
*  文件名:Calc_Max_Separation.cpp
*  文件描述:解决拆分乘积最大问题
*  创建人: RainLeaf, 2009年5月5日
*  版本号:1.0
*  修改记录:
*********************************************************************/

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>

long _max = 0;	/* 保留结果最大的乘积	*/
long _div = 1;	/* 保留划分的次数	*/

long main( void )
{
long	m_number,	/* 用户输入待拆分的数字 */
m_traders,	/* 保留商		*/
m_remainder;	/* 保留余数		*/

long i,j;		/* 计数变量		*/

printf("Input a number to separation:");
scanf("%d", &m_number);

/* 从2开始对用户输入的数字进行划分 */
for( i = 2; i <= m_number; i++ )
{
long m_mul = 1;			/* 临时成绩的结果	*/

m_traders = m_number / i;	/* 得到均分的商		*/
m_remainder = m_number % i;	/* 保留余数		*/

for( j = 0; j < i - 1; j++ )
{
m_mul *= m_traders;
}

m_mul *= m_traders + m_remainder;/* 计算最终的乘积	*/

/* 如果当前划分乘积结果比以前的大,则保存此次划分 */
if( _max < m_mul )
{
_max = m_mul;
_div = i;
}
}

/* 以下为格式化输出结果,没有涉及太多算法 */
m_traders = m_number / _div;
m_remainder = m_number % _div;

printf("Separation expression is: %d = ", m_number);
for( i = 0; i < _div - 1; i++ )
{
printf("%d + ", m_traders);
}
printf("%d", m_traders + m_remainder);

printf("/nThe product of the biggest combination is: %d = ", _max);
for( i = 0; i < _div - 1; i++ )
{
printf("%d * ", m_traders);
}
printf("%d", m_traders + m_remainder);

printf("/nDiv = %d;/tMul_Result = %d;/n", _div, _max);
system("pause");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: