XYLX 10.13 最优分解方案

该博客介绍了一个数学问题:如何将正整数n分解为互不相等的正整数之和,以最大化这些数的乘积。当主持人给出n(1 <= n <= 1000)时,需要快速计算出乘积的最大值。问题解决方案是将数分解为从2开始的连续数字,如果不足则从前向后分配1。样例输入7,输出12。博客提到了使用高精度进行计算的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最优分解方案


[问题描述]

经过第一轮的游戏,不少同学将会获得圣诞特别礼物,但这时细心的数学课代表发现了一个问题:留下来的人太多而使礼物数量可能不够,为此,加试了一道数学题:将一个正整数n分解成若干个互不相等的正整数的和,使得这些数的乘积最大,当主持人报出一个n后,请你立即将这个最大值报出来,现请你帮你的好友编一个程序来解决这个问题。

输入输出


[输入文件]

输入文件best.in中只有1个数n(其中1<=n<=1000)。


[输出文件]

输出文件best.out中也是一个数,是乘积的最大值。


样例 Sample


[输入样例]

7


[输出样例]

12


分析

该题直接将数分解成从2开始连续的数字,如果不足以连续则将最后一个数字从后向前一次分给每个数一个1.知道分完;
注意要加高精。

代码如下

program best;
type ar=array[0..10000] of longint;
var n,sum,total,now,i,j:longint;
    ans:ar;
    num:array[1..10000] of longint;
procedure mutiply(var ans:ar;x:longint);
var i:longint;
begin
 for i:=1 to ans[0] do
  begin
   ans[i]:=ans[i]*x;
  end;
 for i:=1 to ans[0]+20 do
  begin
   ans[i+1]:=ans[i+1]+(ans[i] div 10);
   ans[i]:=ans[i] mod 10;
  end;
 ans[0]:=ans[0]+20;
 while (ans[0]>0) and (ans[ans[0]]=0) do dec(ans[0]);
end;

begin
 readln(n);
 now:=2;
 sum:=0;
 while n<>0 do
  begin
   if n>now
    then
     begin
      inc(sum);
      num[sum]:=now;
      n:=n-now;
      now:=now+1;
     end
    else
     begin
      inc(sum);
      num[sum]:=n;
      n:=0;
     end;
  end;
 while (sum>1) and (num[sum]<=num[sum-1]) do
  begin
   j:=sum-1;
   while (j>0) and (num[sum]>0) do
    begin
     num[j]:=num[j]+1;
     num[sum]:=num[sum]-1;
     j:=j-1; 
    end;
   if num[sum]=0 then dec(sum);
  end;
 ans[1]:=1;
 ans[0]:=1;
 for i:=1 to sum do
  begin
    mutiply(ans,num[i]);
  end;
 for i:=ans[0] downto 1 do
  write(ans[i]);
end.

╮(╯﹏╰)╭

         ___
 `-._\ /     `~~"--.,_
------>|              `~~"--.,_
 _.-'/ '.____,,,,----"""~~```'

萝卜,嘿嘿

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值