1. 【问题描述】输入一串字符,字符个数不超过100,且以"."结束。 判断它们是否构成回文。
分析:所谓回文指从左到右和从右到左读一串字符的值是一样的,如12321,ABCBA,AA等。先读入要判断的一串字符(放入数组letter中),并记住这串字符的长度,然后首尾字符比较,并不断向中间靠拢,就可以判断出是否为回文。
【参考程序】:
var
letter : array[1..100]of char;
i,j : 0..100;
ch : char;
begin
{读入一个字符串以'.'号结束}
write('Input a string:');
i:=0;
read(ch);
while ch<>'.' do
begin
i:=i+1;letter[i]:=ch;
read(ch);
end;
{判断它是否是回文}
j:=1; while (j<i)and(letter[j]=letter[i])do
begin
i:=i-1;
j:=j+1;
end;
if j>=i then writeln('Yes.')
else writeln('No.');
end.
2. 奇数阶魔阵
【问题描述】魔阵是用自然数1,2,3…,n2填n阶方阵的各个元素位置,使方阵的每行的元素之和、每列元素之和及主对角线元素之和均相等。奇数阶魔阵的一个算法是将自然数数列从方阵的中间一行最后一个位置排起,每次总是向右下角排(即Aij的下一个是i+1,j+1)。但若遇以下四种情形,则应修正排数法。
(1) 列排完(即j=n+1时),则转排第一列;
(2) 行排完(即i=n+1时),则转排第一行;
(3) 对An,n的下一个总是An,n-1;
(4) 若Aij已排进一个自然数,则排Ai-1,j-2。
例如3阶方阵,则按上述算法可排成:
4 3 8
9 5 1
2 7 6
【参考程序】:
var
a : array[1..99,1..99]of integer;
i,j,k,n : integer;
begin
fillchar(a,sizeof(a),0);
write('n=');readln(n);
i:=n div 2+1;
j:=n;
a[i,j]:=1;
for k:=2 to n*n do
begin
if (i=n)and(j=n) then
j:=j-1
else
begin
i:=i mod n +1;
j:=j mod n +1;
end;
if a[i,j]<>0 then
begin
i:=i-1;
j:=j-2;
end;
a[i,j]:=k;
end;
for i:=1 to n do
begin
for j:=1 to n do
write(a[i,j]:5);
writeln;
end;
end.
3. 编制用筛法求1-n(n≤200)以内素数的程序。 分析: 由希腊著名数学家埃拉托色尼提出的所谓"筛法",步骤如下:
①将所有候选数放入筛中;
②找筛中最小数(必为素数)next,放入集合primes中;
③将next的所有倍数从筛中筛去;
④重复②~④直到筛空。
编程时,用集合变量sieve表示筛子,用集合primes存放所有素数。
【参考程序】
program ex10_3;
const n=200;
var sieve,primes:set of 2..n;
next,j:integer;
begin
sieve:=[2..n];{将所有候选数放入筛中}
primes:=[];{素数集合置空}
next:=2;
repeat
{找筛sieve中最小一个数}
while not (next in sieve) do
next:=succ(next);
primes:=primes+[next];{将最小数放入素数集合中}
{将这个素数的倍数从筛中删去}
j:=next;
while j<=n do
begin
sieve:=sieve-[j];
j:=j+next;
end
until sieve=[];
j:=0;
for next:=2 to n do{打印出所有素数}
if next in primes then
begin
write(next:5);
j:=j+1;
primes:=primes-[next];
end;
writeln;
end.