[SCOI2006]整數劃分 高精度
阿新 • • 發佈:2018-12-12
題目描述
從檔案中讀入一個正整數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();
}
}