[问题描述]
经过第一轮的游戏,不少同学将会获得圣诞特别礼物,但这时细心的数学课代表发现了一个问题:留下来的人太多而使礼物数量可能不够,为此,加试了一道数学题:将一个正整数n分解成若干个互不相等的正整数的和,使得这些数的乘积最大,当主持人报出一个n后,请你立即将这个最大值报出来,现请你帮你的好友编一个程序来解决这个问题。
[输入文件]
输入文件best.in中只有1个数n(其中1<=n<=1000)。
[输出文件]
输出文件best.out中也是一个数,是乘积的最大值。
[输入样例]
7
[输出样例]
12
解题思路
这个题是分解数(贪心)+高精
首先必须知道,这样分解出来的乘积是最大的:
1是没有意义的而且使总数少了1
先将这个数分解成连续自然数2,3,4,5。。。知道剩下的数字小于最后一个数字。然后将剩下的数字分配给这些连续自然数,从大到小分配,每次每个数都分配1,直到剩下0
代码
type ar=array[0..255]of longint;
var a:array[1..1000]of integer;
ans:string;
n,num,i,x,len:longint;
num1:ar;
procedure cheng(x:integer);
var i:longint;
begin
for i:=1 to len do num1[i]:=num1[i]*x;
for i:=1 to len do
begin
num1[i+1]:=num1[i+1]+num1[i] div 10;
num1[i]:=num1[i] mod 10;
end;
while num1[len+1]<>0 do
begin
inc(len);
num1[len+1]:=num1[len+1]+num1[len] div 10;
num1[len]:=num1[len] mod 10;
end;
end;
begin
readln(n);
x:=2;
num:=0;
while n>x do
begin
inc(num);
a[num]:=x;
n:=n-x;
inc(x);
end;
while n>0 do
begin
for i:=num downto 1 do
begin
inc(a[i]);
dec(n);
if n=0 then break;
end;
end;
fillchar(num1,sizeof(num1),0);
num1[1]:=1; len:=1;
for i:=1 to num do cheng(a[i]);
for i:=len downto 1 do write(num1[i]);
end.
测试点1 Accepted / 0ms / 260kB
测试点2 Accepted / 0ms / 260kB
测试点3 Accepted / 0ms / 260kB
测试点4 Accepted / 0ms / 260kB
测试点5 Accepted / 0ms / 260kB
测试点6 Accepted / 0ms / 260kB
测试点7 Accepted / 0ms / 260kB
测试点8 Accepted / 0ms / 260kB
测试点9 Accepted / 0ms / 260kB