procedure2012
It's not worth it to know you're not worth it!

[题目来源]:NOIP基础程序题集

[关键字]:数学

[题目大意]:给定整数N,将其分解为若干个互不相同的整数,是他们的乘积最大

//============================================================================================================

[分析]:为了使最后分解的数的乘积最大,首先我们应该确定 n 应该分解为几个数(其实就是 n可以分出的最多个数),确定过程就是从 2开始以步差为 1累加,直到恰好小于 n位置(就是找最大数为k,使 2+3+…+k=t<n,划分成的个数应该为 k+1);确定下来后,由于 n剩下来了一些,所以将这些平均的加到 k-2 上,由于不能平分,所以应该是先所有数加上(n-t)divk,然后较大的(n-t)modk个数多加一个 1。这样就确定下来了所有的数。最后将其相乘即可,注意结果必会超任何数据类型范围,所以要用高精度。

[代码]:

 

View Code
 1 program Project1;
2 type
3 rec = record
4 len: longint;
5 dat: array[0..2000] of longint;
6 end;
7 var
8 s, t, n, k, i: longint;
9 ans: rec;
10 a: array[0..2000] of longint;
11
12 procedure cheng(var ans: rec; x: longint);
13 var
14 i: longint;
15 begin
16 k := 0;
17 for i := 1 to ans.len do
18 begin
19 ans.dat[i] := ans.dat[i]*x+k;
20 k := ans.dat[i] div 10;
21 ans.dat[i] := ans.dat[i] mod 10;
22 end;
23 while k > 0 do
24 begin
25 inc(ans.len);
26 ans.dat[ans.len] := k mod 10;
27 k := k div 10;
28 end;
29 end;
30
31 begin
32 assign(input,'d:\in.txt');reset(input);
33 assign(output,'d:\out.txt');rewrite(output);
34 readln(n);
35 a[1] := 2;
36 s := 2;
37 t := 1;
38 while s+a[t]+1 <= n do
39 begin
40 inc(t);
41 a[t] := a[t-1]+1;
42 s := s+a[t];
43 end;
44 k := (n-s) div t;
45 for i := 1 to n do inc(a[i],k);
46 k := (n-s) mod t;
47 for i := t-k+1 to t do inc(a[i]);
48 ans.len := 1;
49 ans.dat[1] := 1;
50 for i := 1 to t do
51 cheng(ans,a[i]);
52 for i := 1 to t do write(a[i],'');
53 writeln;
54 write('Ans= ');
55 for i := ans.len downto 1 do write(ans.dat[i]);
56 close(input);
57 close(output);
58 end.

 

posted on 2011-10-29 16:56  procedure2012  阅读(306)  评论(0编辑  收藏  举报