[SCOI2006]整数划分 高精度 BZOJ 1863

题目描述

从文件中读入一个正整数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();
  }
      
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值