最近遇到一个笔试题,这里与大家分享一下
有⼀堆糖果,其数量为n,现将糖果分成不同数量的堆数(每堆数量均为整数,最少为1),请算出糖果堆对应数量的最⼤乘积是多少,并给出对应的分配⽅案;
举例:糖果数量为8,可以得到的乘积最⼤为18,对应的分配⽅案为【2,3,3】;
/**
* 题目:
* 编程题:有⼀堆糖果,其数量为n,现将糖果分成不同数量的堆数(每堆数量均为整数,最少为
* 1),请算出糖果堆对应数量的最⼤乘积是多少,并给出对应的分配⽅案;
* 举例:糖果数量为8,可以得到的乘积最⼤为18,对应的分配⽅案为【2,3,3】;
* <p>
* 题目分析:
* 设糖果总数为n
* 经过举例发现,糖果总数小于等于3时,最大乘积等于糖果总数减一(例如:2(1*1=1),3(2*1=2)),总结最大乘积为reult = n-1
* 糖果总数对三取模,n是三的整数倍时,最大乘积=3的int(n / 3)次方
* n对三取模为1时,最大乘积=3的(int(n / 3)-1)*4次方
* n对三取模为2时,最大乘积=3的(int(n / 3))*2次方
*/
public class CandyManager {
static Scanner scan = new Scanner(System.in);
public static void main(String[] args) {
candySplit();
}
public static void candySplit() {
System.out.println("请输入糖果总数:");
int candyNum = scan.nextInt();
int[] arr = new int[0];
int maxProduct = 0;
if (candyNum <= 3) {
arr = new int[2];
arr[0] = 1;
arr[1] = candyNum - 1;
maxProduct = candyNum - 1;
System.out.println(returnStringResult(candyNum, maxProduct, arr));
return;
}
int quotient = candyNum / 3;
int remainder = candyNum % 3;
if (remainder == 0) {
// 指定数组长度
arr = new int[2];
for (int i = 0; i <= quotient; i++) {
arr[i] = 3;
}
maxProduct = (int) Math.pow(3, quotient);
} else if (remainder == 1) {
// 指定数组长度
arr = new int[quotient + 1];
for (int i = 0; i <= quotient; i++) {
arr[i] = 3;
}
arr[quotient] = 4;
maxProduct = (int) Math.pow(3, quotient - 1) * 4;
} else {
// 指定数组长度
arr = new int[quotient + 1];
for (int i = 0; i <= quotient; i++) {
arr[i] = 3;
}
arr[quotient] = 2;
maxProduct = (int) Math.pow(3, quotient) * 2;
}
// 组装字符串
System.out.println(returnStringResult(candyNum, maxProduct, arr));
}
// 返回结果字符串
public static String returnStringResult(int candyNum, int maxProduct, int[] arr) {
String arrStr = Arrays.toString(arr).replace("[", "").replace("]", "");
String aa = "糖果数量为%s,可以得到的乘积最⼤为%s,对应的分配⽅案为【%s】;";
return String.format(aa, String.valueOf(candyNum), String.valueOf(maxProduct), arrStr);
}
}
执行结果如下: