1.	共20分(2+2+2+2+2+4+3+3分)
一个正整数(非素数)可以表示成它的因子(1与其本身除外)的乘积。
        例如:12有因子2,2,3,4,6,所以可表示为:
              12=2*2*3=4*3=2*6
  给出任一个整数n,求出它所有的因子乘积表达式(交换律得出的不同式子算同一种)。
  算法说明:读入一个整数n,首先求出它的所有的因子以及每个因子可能的次数。
  例如:整数48:
        因子:2  3  4  6  8  12  16  24
        次数:4  1  2  1  1  1    1   1
  将上面的结果存入数组a:array[0..20,1..2]中,其中:
  a[i,1]表示因子;a[i,2]表示次数。
  然后用简单回朔的方法求出所有可能的表示:
  数组b[0..20]记录取数情况;c:array[0..20]工作单元。
 
  program  exp4(input,output);
  var a        :array[0..20,1..2] of integer;
     c,b       :array[0..20] of integer;
     n,m,i,j,s,k,l : integer;
  begin
    readln(n);   for i:=i to 20 do    a[i,1]:=0;
         A[0,1]:=1 ;  a[0,2]:=1;    j:=0;
    for i:=2 to n-1 do
    begin
      s:=0;   m:=n;
      while(m<>0) and (m mod i=0) do
      begin    m:=m div i;     S:=S+1   ;    end;
        if S>0 then begin
                          j:=j+1;  A[J,1]:=i ;  a[j,2]:=  S;
                         end
     end;
     for i:=0 to j do b[i]:=0;
     while  B[K]=A[K,2]  do
       begin
         k:=j;
         while b[k]=a[k,2] do k:=k-1;
         b[k]:=b[k]+1;
         for l:=  K+1 TO J do b[l]:=0;
         s:=1;
         for i:=1 to j do
           if b[i]<>0 then for l:=1 to b[i] do  S:=S*A[i,1]  ;
           if s=n then begin
                      for i:=1 to j do c[i]:=b[i];
                      write('('); m:=1;  
                      for i:=1 to j do
                      while (c[i]>0) and (m<>n) do
                        begin
                          m:=m*a[i,1];
                          if m=n then write(a[i,1])
                                  else begin
                                         write(a[i,1],'*');
                                         c[i]:=c[i]-1;
                                        end;
                         end;
                       writeln(')');
                     end
           end
  end.
			
				
							  
							 
				
			
		 	
			
		
			
							 
				2.	问题描述:共14分(4+2+3+3+2分)
给出一个凸多边形,可以取得若干个内接三角形,同时约定内接三角形必 须有一条边(仅能有一条边)与凸多边形的边相重合,例如:下面的5边形中,可能有 的内接三角形有5种:
 
问题:当依次给出凸多边形的每个顶点的2个坐标之后,找出一个面积最大的内接三角
  形,输出该三角形的面积与三个顶点的坐标。
  [算法说明]:凸多边形的每个顶点用一对坐标(x,y)表示;
             用数组p:array[1..2*n] of point; 存贮输入的顶点坐标;
             同时编制一个由三角形的三个顶点计算其面积的函数sea。
program exp5(input,output);
  const n=6;
  type point=record x,y:real end;
  var p           :array[1..2*n] of point;
     i,j           :integer;
     q1,q2,q3     :point;
     smax        :real;
 function sea(p1,p2,p3:point):real;
   var s1,s2,s3,p4:real;
     begin
       s1:=sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y));
       s2:=sqrt((p1.x-p3.x)*(p1.x-p3.x)+(p1.y-p3.y)*(p1.y-p3.y));
       s3:=sqrt((p2.x-p3.x)*(p2.x-p3.x)+(p2.y-p3.y)*(p2.y-p3.y));
       p4:= (S1+S2+S3)/2  ; sea:=sqrt(p4*(p4-s1)*(p4-s2)*(p4-s3));
     end;
   begin
     for i:=1 to n do readln(p[i].x,p[i].y);  smax:=0;
     for i:=1 to n-1 do  P[n+i]:=P[i]    
     for i:=1 to n do
     for j:=   i+3 TO i+2+n-4    do
     if   Smax<Sea(P[i],P[i+1],P[j])   then 
       begin
         smax:=sea(p[i],p[i+1],p[j]); 
         q1:=p[i];  q2:=  P[i+1]    ;   q3:=p[j]
       end;
     writeln(smax,q1.x,q1.y,q2.x,q2.y,q3.x,q3.y)
   end.
			
				
							  
							 
				
			
		 	
			
		
			
							 
				3.	问题描述:共22分(3+2+2+3+4+2+3+3分)
拼图形:边长为1的正方形面积为1,从边长为1的正方形出发可以用2个
边长为1的正方形拼成面积为2的长方形:
同时约定:
1.边长对应相等的长方形被认为是相同的;(所以下边的两个面积为2的长方形只看作
一个长方形);
 
2.长度相等的边才能拼接,且两个边必须重合。从面积为2的长方形出发,用2个面积为2的长方形可拼出面积为4的长方形(包括正方形),拼法如下:
  
同样再从面积为4的长方形(包括正方形)出发,可以拼成面积为8的长方形,拼法如
下:
 
可以按上面的方法继续拼下去。
问题:输入一个数N,输出面积不超过N的所有可能拼法。例如:当N=20时,
输出:(1,1),(2,1),(4,2),(8,2),(16,3)即面积为1的拼法1种,面积为2的拼法1种,面积为
4的拼法2种,面积为8的拼法2种,面积为16的拼法3种。
 
[算法说明]:矩形可以用三个数x,y,s来表示,其中x,y表示边长,s表示面积,并用数组
G[1..100,1..3]表示图形。
当给出n之后,可能拼接的次数为r满足:2r<=N<2r+1(不包括面积为1的拼法);
用数组b[1..100]记录各种面积可能出现的拼法。
Program exp8(input,output);
 type g=record  x,y,z:integer  end;
 var g1:array[1..100] of g;
    i,j,n,s1,jj,j1,j2,i1 :integer;
    b:array[1..100] of integer;
    gw:g;
 Function eq(gk:g):boolean;
    var jeq:integer;  p:boolean;
    begin
      p:=true;  jeq:=1;
      while (p and (jeq<=j)) do 
      if ((gk.x=g1[jeq].x) and (gk.y=g1[jeq].y))
         or ((gk.x=g1[jeq].y) and (gk.y=g1[jeq].x))
      then p:=false else jeq:=jeq+1;
      eq:=p
    end;
 Begin
    readln(n);  n:=n+1;  s1:=1;  jj:=1;
    while  S1<N  do
      begin  S1:=S1+S1  ;  jj:=jj+1  end;
         JJ:=JJ-1  ;   j1:=1;   j:=1;
    g1[j].x:=1;  g1[j].y:=1;   g1[j].z:=1;
    for i:=2 to jj do
      begin
        j2:=j;
        for i1:=j1 to j2 do
          begin
            gw.x:=g1[i1].x*2;  gw.y:=g1[i1].y;  gw.z:=g1[i1].z*2;
            if  Eq(gw)  then begin
                             j:=j+1;  g1[j]:=gw
                            end;
            gw.x:=g1[i1].x;    Gw.y:=G1[i1].y*2    
            if eq(gw) then begin
                          j:=j+1; g1[i]:=Gw ;
                        end;
          end;
        j1:=j2+1
      end;
      for i:=1 to n do b[i]:=0;
     for i:=1 to j do   B[g1[i].z]:=B[g1[i].z]+1 ;
    for i:=1 to n do    if  B[i]<>0   then write('(',i,',',b[i],')');
  End.