1. 【问题描述】方阵填数:在一个N×N的方阵中,填入1,2,.....N×N个数,并要构成如下的格式:
如 N=4 N=5
10 11 12 1 13 14 15 16 1
9 16 13 2 12 23 24 17 2
8 15 14 3 11 22 25 18 3
7 6 5 4 10 21 20 19 4
9 8 7 6 5
【参考程序】
Var
j:Integer;
n,i,k,x,y,Number:Byte;
Result:Array[1..25,1..25] of Byte;
Begin
Write('N='); Readln(n);
For x:=1 to n do for y:=1 to n do Result[x,y]:=0;
X:=0; Y:=N; i:=0; k:=N; j:=1;
While i< n*n do
Begin
For i:=i+1 to i+k do
Begin
x:=x+j ;
Result[x,y]:=i;
End;
Dec(k);
If j=1 then j:=-1 else j:=1;
For i:=i+1 to i+k do
Begin
y:=y+j;
Result[x,y]:=i;
End;
End; For x=1 to n do
Begin
For y:=1 to n do Write(Result[x,y]:3);
Writeln;
End;
End.
2. 【问题描述】数学上定义:
n!=1×2×3×...×(n-1)×n (N>0)
0!=1 若用integer型数据表示阶乘,最多可到7!,用Longint类型也只能到12!
要求输入正整数n,求 n! 的精确表示
【参考程序】
const max=1000;
var n,i,j,jinwei,weishu:integer;
result:array[1..max] of integer;
begin
writeln('input n:');readln(n);
fillchar(result,sizeof(result),0);
result[1]:=1;
jinwei:=0;
weishu:= 1 ;
for i:=2 to n do begin
jinwei:=0;
for j:=1 to weishu do begin
result[j]:= result[j]*i+jinwei ;
jinwei:=result[j] div 10;
result[j]:=result[j] mod 10;
end;
while jinwei<>0 do begin
weishu:=weishu+1;
result[weishu]:=jinwei mod 10;
jinwei:= jinwei div 10 ;
end;
if weishu>max then begin writeln('error!');halt;end;
end;
write(n,'!=');
for i:= weishu downto 1 do write(result[i]);readln;
end.
3. 【问题描述】01串统计。给定一个01串,请你找出长度介于a,b之间,重复出现次数最多的01串。
输入:a,b(0<a<=b<=12)以及
由0,1组成的数串,由‘.’结尾。
输出:要求的串。 提示:本程序中将01序列转换为2进制数存取。
【参考程序】
program shuchuan;
var i,j,s,k,a,b,max:integer;
m:array[1..8192] of integer;
two,v:array[1..20] of integer;
c:char;
begin
for i:=1 to 13 do
two[i]:=1 shl i ;
readln(a,b);
read(c);
s:=1;k:=1;
while c<>’.’ do begin
s:=s shl 1+ord(c)-48;
if k>b then
s:=((s-two[b+1]) mod two[b])+two[b];
inc(m[s]);
if k<b then
for i:=a to k-1 do
inc(m[s mod two[i]+two[i]]) ;
inc(k);
read(c);
end;
for i:=two[b] to two[b+1] do
if m[i]>0 then
for j:=a to b-1 do
m[(i mod two[j])+two[j]]:= m[i mod two[j]+two[j]]+m[i] ;
max:=0;
for i:=two[a] to two[b+1] do
if m[i]>max then max:=m[i];
for i:=two[a] to two[b+1] do
if m[i]=max then begin
j:=0;k:=i;
repeat
inc(j);v[j]:=k mod 2; k:=k div 2;
until k=1 ;
while j>0 do begin write(v[j]);dec(j) end;
writeln;
end;
end.