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.