zoukankan      html  css  js  c++  java
  • 解题报告 整数划分

    整数划分(sum.pas/c/cpp)

     

    【题目描述】

        从文件中读入一个正整数n(10≤n≤31 000)。要求将n写成若干个正整数之和,并且使这些正整数的乘积最大。 例如,n=13,则当n表示为4+3+3+3(或2+2+3+3+3)时,乘积=108为最大。 

     

    【输入格式】(sum.in):

        一个整数,n

     

    【输出格式】(sum.out):

        第1行输出一个整数,为最大乘积的位数。 第2行输出最大乘积的前100位,如果不足100位,则按实际位数输出最大乘积。 (提示:在给定的范围内,最大乘积的位数不超过5000位)。 

     

    【输入样例】

        13

     

    【输出样例】

        3

    108

     

     

     

    呃,话说这是一个很经典的规律: 越多越好,如果剩下了 ,就与最后一个 拼成 ,如果剩下了 ,就直接 *2 。。。。。。。

    然后,就是高精了。

     

    代码(SueMiller

    program ACRush;

    type arr=array[0..6000]of longint;

    var n,nn:longint;

        i,j,k,l,r,mid,ll,rr:longint;

        ans:arr;

     

    procedure mul(b:longint);

    var i:integer;

    begin

      for i:=1 to ans[0] do

        ans[i]:=ans[i]*b;

      for i:=1 to ans[0] do

        begin

          ans[i+1]:=ans[i] div 10+ans[i+1];

          ans[i]:=ans[i] mod 10;

        end;

     

      while ans[ans[0]+1]>0 do

        begin

          inc(ans[0]);

          ans[ans[0]+1]:=ans[ans[0]] div 10;

          ans[ans[0]]:=ans[ans[0]] mod 10;

        end;

    end;

     

    begin

      assign(input,'sum.in');reset(input);

      assign(output,'sum.out');rewrite(output);

     

      readln(n);

     

      ll:=0;rr:=0;

      l:=2;r:=n>>1;

     

          i:=n div 3;

          fillchar(ans,sizeof(ans),0);

          ans[1]:=1;

          ans[0]:=1;

          if n mod 3=0 then

            begin

              k:=3;

              for j:=1 to i do

                mul(k);

            end

          else begin

            nn:=n-n div 3*3;

            for j:=1 to i-1 do

              begin

                mul(3);

              end;

    if nn=2 then

      begin

        mul(3);

    mul(nn);

      end

    else begin

      mul(4);

    end;

    //        for j:=1 to i do write(d[j],' ');

    //        writeln;

    //        for j:=ans[0] downto 1 do write(ans[j]);

    //        writeln;

          end;

     

        writeln(ans[0]);

        if ans[0]>100 then

          begin

            for i:=ans[0] downto ans[0]-100+1 do

              write(ans[i]);

            writeln;

          end

        else begin

          for i:=ans[0] downto 1 do

            write(ans[i]);

          writeln;

        end;

     

      close(input);close(output);

    end.

  • 相关阅读:
    「持续集成实践系列」Jenkins 2.x 搭建CI需要掌握的硬核要点
    常用的20个在线工具类网站清单
    推荐一款Python神器,5 行 Python 代码 实现一键批量扣图
    一套测试用例如何实现支持多个环境运行
    推荐一款Python数据可视化神器
    全网独家:成长经历分享 & 我为什么要写书?
    整理一份程序员常用的各类工具、技术站点
    关于《自动化测试实战宝典:Robot Framework + Python从小工到专家》
    重磅新书 |《自动化测试实战宝典:Robot Framework + Python从小工到专家》上市了!
    献给即将35岁的初学者,焦虑 or 出路?
  • 原文地址:https://www.cnblogs.com/SueMiller/p/2243430.html
Copyright © 2011-2022 走看看