Description:设n是一个正整数。现要求将n分解为若干个自然数的和,且使这些自然数的乘积最大。对于给定的正整数n,编程计算最优分解方案。
Sample Input:
10
Sample Output:
36
analysis:
若 a + b = c,则 | a – b | 越小,a × b 越大。根据原问题的描述,需要将正整数 n 分解为若干互不相同的自然数的和,同时又要使自然数的乘积最大。当 n < 4 时对 n 的分解的乘积是小于 n 的;当 n 大于或等于 4 时,n = 1 + ( n – 1 ) 因子的乘积也是小于 n 的,所以 n = a + ( n – a ),2 ≤ a ≤ n - 2,可以保证乘积大于 n,即越分解乘积越大。将 n 分成从 2 开始的连续自然数的和,如果最后剩下一个数,将此数在后项优先的方式下均匀地分给前面各项,确保最终所分解的自然数的乘积可以取得最大值。
在分解过程中,主要有以下2种情况:
1.当前余数与当前分解出的最后一位数字值相等(如:13 = 2 + 3 + 4 + 4),则最终分解结果必定从3开始(详解于analysis第一段);
2.当前余数与当前分解出的最后一位数字值不等(如:10 = 2 + 3 + 4 + 1),则最终分解结果必定从2开始(详解于analysis第一段);
/*
* =====================================================================================
*
* Filename: MulMax.c
*
* Description:
*
* Version: 1.0
* Created: 2015年12月10日 22时33分14秒
* Revision: none
* Compiler: gcc
*
* Author: lafee, wisdomandmircle@gmail.com
* Company: Class 1301 of Software Engineering
*
* =====================================================================================
*/
#include <stdio.h>
int MulMax( int num ) {
int i = 1 , j;
int mul = 1 ;
while( num > i ) { //当循环结束,num为当前余数
i++ ;
num -= i ;
}
if( num == i ) { //当前余数与最后一位分解出的数字相同,如:13 = 2 + 3 + 4(i) + 4(num)
for( j = 3 ; j < i + 3 ; j++ ) { //最终分解的结果必定从3开始且最后一位数与倒数第二位数之差为2,如:13 = 3 + 4 + 6
if ( j == i + 1 )
continue ;
mul *= j ;
}
} else {
for( j = 2 ; j < i + 2 ; j++ ){ //最终分解的结果从2开始
if( j == i - num + 1 )
continue ;
mul *= j ;
}
}
return mul ;
}
int main() {
int num ;
scanf( "%d", &num ) ;
printf( "MUl = %d\n", MulMax( num ) ) ;
return 0;
}