1. 程式人生 > >[SCOI2006]整數劃分 高精度

[SCOI2006]整數劃分 高精度

題目描述

從檔案中讀入一個正整數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(); } }