对一个小问题的算法思考
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
* 修改记录:
*********************************************************************/
* 问题描述:
* 程序设计题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; }
相关文章推荐
- 一个问题引发的思考
- redis的一个set问题的思考
- 连号区间数 小明这些天一直在思考这样一个奇怪而有趣的问题:
- 快速排序的C#实现以及,算法导论上之后一个习题的思考
- 一个关于拼图算法的问题
- 面试中的一个小问题引发的思考
- 字符串匹配之通配符问题------一串首尾相连的珠子(m个),有N种颜色(N《=10),设计一个算法,取出其中一段,要求包含所有N中颜色,并使长度最短。
- 关于问答区里面的一个算法问题
- [置顶]一个从四秒到10毫秒,花了1年的算法问题?
- 一个问题引发的对类成员指针的思考
- 关于Top n算法问题的一个思路
- 练习Eclipse RCP遇到的一个问题及思考
- 一个背包算法问题
- 一个随机数组的算法问题
- 一个JDK版本问题引发的思考--Java环境配置 && Eclipse的JDK配置
- 问题、思考、解决方案集合、链条--一个小故事
- 对算法问题的思考
- 一个不经意的问题引发的小思考
- 说说单词智能纠错算法--探讨思考问题的方法
- 一个c指针问题的思考