整数拆分之乘积最大化

【题目描述】

度度熊和朋友在玩一个游戏: 给定一个数n,将数n拆成m个数(要求m个数的和等于n):num1 num2…,其中m>1, m<=n,请问num1 num2…这m个数的最大乘积是多少?

例如:

n等于5,m可以等于2,此时2个数分别为:2 3,得到最大乘积为6。(此处两个数也可以取1和4,但是乘积为4,不是最大的)

n等于9,m可以等于3,此时3个数分别为:3 3 3,得到最大乘积为27。

【格式】

输入格式
n
输出格式
maxProduct

【样例】

输入样例
5
输出样例
6

【限制】

时间限制: 1000 ms

内存限制: 65535 KB

解法一:

解题思路:一个数分解成不少于两个数使得所有数的乘积最大化,因此要让每一次分解后的乘积都要比未分解时候的大,比如5分解成2、3,乘积为6,比5大,就可以分解;3分解成1、2,乘积为2比3小,就不能分解。
观察可知,当n=1、2、3时,分解后的乘积都比原来的数小,因此不能分解;
当n=4时,分解为2、2,乘积和4相等,可以分解也可不分解。
当n>=5时,总能用2和3线性表示,即可表示为n=2x+3y,(x,y∈N)
详细证明可参见下面链接:
证明:大数字都可以被拆分为多个2与3的和以获取最大的乘积,只有 2 和 3 不需要拆分
结论:
为了获取最大化的乘积,需要将n拆分出更多的3。

AC代码如下:

#include <iostream>
#include <cmath>
using namespace std;
int max_product(int x){
   	
	if(x==1) return 1;
	if(x==2) return 
  • 7
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值