蓝桥杯周练 摸鱼小张的最大乘积问题
题目描述:
- 一个正整数一般可以分为几个互不相同的自然数的和,如 3=1+2,4=1+3,5=1+ 4= 2 + 3,6=1+5=2+4。
- 现在你的任务是将指定的正整数 n 分解成若干个互不相同的自然数的和,且使这些自然数的乘积最大。
- 输入格式: 输入一个正整数 m (3 <= m <= 1000000)
- 输出格式: 第一行是分解方案,相邻的数之间用一个空格分开,并且按由小到大的顺序。(末尾数后无空格)
- 第二行是最大的乘积。
- 输入样例: 在这里给出一组输入。例如:
10
- 输出样例: 在这里给出相应的输出。例如:
2 3 5
30
以下是本题的主要思路:
大家都清楚这题的意思,我们尽可能的把n分成更多份(都大于1)那样乘积最大。 (这里讲一下如果分出来的数可以重复,那么有时候并不是分出的份数越多越大,比如6,分成2,2,2不如分成3,3。但是不能重复的话就不存在这样的情况,大家可以想一下。) 以“6”为例,我们可以想到,我们先分出来一个2,然后再分出一个3…但是这样面临一个问题:“最后有余数怎么办”,比如“8”;分出来2,3还剩下3,没法再分出4,这时候怎么办呢?有的同学会想我把余数3都加到3身上,我们就分成了2和6,但是这样是最大的吗?(3和5才是最大的) 这时候我补充一下有一篇题解中所说:
“把余数分到大的数上比分到小的数上得到的乘积更大”。
实际不太准确,我们很容易证明出来如果能把数分到更小的数上,那么乘积更大(大家可以想想)。但是为什么最终是分到了大的数呢?就好比把6分成2,4,按照我们刚才的分法,先分出来了2和3最后余1,理论上我们把1给2得到的结果更大,但是我们不允许数重复,所以我们需要先把1给3,这样如果还剩下余数的话就分给2,所以当小的数被分配某个数后不会造成数的重复,那么优先给小的数分配,所以就像其他题解所说:
“从大数开始向前,依次分配1”。
所以对于8我们先分配出了2,3又余3,我们先分配1给3,得到2,4这时候2可以被分配,那么我们就分配给2一个1,得到3和4,这时候还余1,我们就分配给4,得到3,5。
代码:
package test;
/**
* @author zhazhalin
* @version 1.0
* @date 2021/4/1 12:05
*/
import java.sql.Statement;
import java.util.Scanner;
/**
* 一个正整数一般可以分为几个互不相同的自然数的和,如 3=1+2,4=1+3,5=1+ 4= 2 + 3,6=1+5=2+4。
* 现在你的任务是将指定的正整数 n 分解成若干个互不相同的自然数的和,且使这些自然数的乘积最大。
* 输入格式:
* 输入一个正整数 m (3 <= m <= 1000000)
* 输出格式:
* 第一行是分解方案,相邻的数之间用一个空格分开,并且按由小到大的顺序。(末尾数后无空格)
* 第二行是最大的乘积。
* 输入样例:
* 在这里给出一组输入。例如:
* 10
* 输出样例:
* 在这里给出相应的输出。例如:
* 2 3 5
* 30
*/
public class