最优分解(贪心)

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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值