不是VIP会员,不能显示答案

题目解答

题目:
共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.
考点:
分析:
解答:
评论:
老师: