1. [问题描述] 读入n个不相同且不为0的数(1<=n<=100),不用排序,求出其中第r个大的数(1≤r≤n),即有r-1个数比它大,其余的数都比它小。
例如:输入3,14,22,15,17,6,其中第3个大的数为15。
[算法说明] 以数组a[1..100]记录读入的n个数,并以0结束(0本身不是n个数中的数)。然后从第一个数开始,将它与其余的数进行比较并记录出比它大的数的个数(存于变量y中),若y=r-1时,得到所求结果:否则对下一个数进行同样的处理。
[程序清单]
program exp2(input,output)
Var r,i,j,k,x,y : integer;
a : array[1..100] of integer;
p : boolean;
Begin
j:=0;
readln(x);
while X<>0 do
begin
J:=J+1 ;
a[j]:=x;
READLN(X)
end;
readln(r); p:=true; i:=1;
while p do
begin
X:=A[I] ; y:=0;
for k:=1 to j do
if x<a[k] then Y:=Y+1 ;
if Y=R-1 then begin
writeln(x);
p:=false
end
else i:=i+1
end
End.
2. [问题描述] 在进行正整数的除法运算时,可以通过减法来实现。
例如x?y=Q..R(Q:商,R:余数)可通过下列的方式实现:
q:=0; r:=x;
while r>=y do begin r:=r-y; q:=q+1 end;
结果,商在q中,余数在r中。
[算法说明] 上面的算法有一个缺点,就是当x比较大、y比较小时,则运算的次数非常多,速度太慢。为提高速度,下面给出改进的算法:先找一个非常接近x的数w,且满足:w=y?2k,y?2 k-1<=x<w,然后通过减法与移位的运算,以较少的运算次数完成除法。
[程序清单]
program exp3(input,output)
var x,y,w,r,q:integer;
Begin
readln(x);
r:=x;
W:=Y
while w<=r do W:=W+W
q:=0;
while W>Y do
begin
w:=w div 2;
Q:=Q+Q
if r>=w then begin
Q:=Q+1 ;
R:= R-W ;
end;
end;
writeln(q, ‘…’, R);
End.
3. [问题描述] 一个正整数(非素数)可表示成它的因子(1与其本身除外)的乘积。
例如:12有因子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[?,1]表示因子;A[?,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
WRITELN;readln(n);
for i:=1 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;
whil b[0]=0 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,j])
else begin
write(A[i,1],’?’);
c[i]:=c[i]-1;
end;
end;
writeln(‘)’);
end
end
End.