【题目描述】
度度熊和朋友在玩一个游戏: 给定一个数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