题目描述
从文件中读入一个正整数n(10≤n≤31000)。要求将n写成若干个正整数之和,并且使这些正整数的乘积最大。
例如,n=13,则当n表示为4+3+3+3(或2+2+3+3+3)时,乘积=108为最大。
输入输出格式
输入格式:
只有一个正整数:n (10≤n≤31000)
输出格式:
第1行输出一个整数,为最大乘积的位数。
第2行输出最大乘积的前100位,如果不足100位,则按实际位数输出最大乘积。
(提示:在给定的范围内,最大乘积的位数不超过5000位)。
输入输出样例
输入样例#1: 复制
13
输出样例#1: 复制
3
108
将一个数分解使其乘积最大:
可以类比,当每个数都尽量靠近时,乘积会变大;
所以我们每次按3来分解,分解3而不行的时候,按2分解即可;
然后高精度即可;
import java.math.*;
import java.time.chrono.*;
import java.util.Calendar;
import java.util.Scanner;
import java.util.function.BiFunction;
import javax.xml.bind.ValidationEvent;
public class Main {
public static void main(String[] args) {
Scanner cin=new Scanner(System.in);
int n;
n=cin.nextInt();
BigInteger ans;
BigInteger th;
int threeNum=0;
if(n==1) {
System.out.println(1);System.out.println(1);
}
else {
ans=BigInteger.valueOf(1);
while(n>4) {
threeNum++;n-=3;
}
if(n==4||n==2)ans=ans.multiply(BigInteger.valueOf(n));
else if(n==3)threeNum++;
for(int i=1;i<=threeNum;i++) {
ans=ans.multiply(BigInteger.valueOf(3));
}
String ss=ans.toString();
int len=ss.length();
System.out.println(len);
if(len>100) {
for(int i=0;i<100;i++) {
System.out.print(ss.charAt(i));
}
System.out.println();
}
else System.out.println(ans);
}
// cin.close();
}
}