haihongyuan.com
海量文库 文档专家
全站搜索:
您现在的位置:首页 > 初中教育 > 学科竞赛学科竞赛

p练习130525

发布时间:2014-04-30 13:36:27  

1、对6-1000内的偶数验证哥德巴赫猜想:任何一个大于6的偶数总可以分解为两个素数之和。

分析:哥德巴赫猜想是一个古老而著名的数学难题,它的理论证明十分复杂。在这里我们用计算机对有限范围内的数加以验证,即任意输入一个大于6的偶数,若能拆分成两个素数,则认为该猜想成立。

解题的关键是判素数。假设定义函数prime(x),用来判断x是否为素数。若x为素数,则函数prime值为1,若不是素数则prime值为0。

program ex17(input,output);

var

n,m:integer;

function prime(x:integer):integer;

var

f,i:integer;

begin

f:=1;

for i:=2 to trunc(sqrt(x)) do if x mod i=0 then f:=0;

prime:=f

end;

begin

repeat

readln(n);

until(n>6) and (n<1000) and (n mod 2=0);

for m:=2 to n div 2 do

if prime(m)+prime(n-m)=2

then writeln(n,’=’,m,’+’,n-m);

end.

思考题: 将7-100之间的奇数分解为三个素数的和

2、一个两位以上的自然数,如果左右数字对称,就称为回文数,编程找出所有不超过6位数字的回文数,同时又是完全平方数的数。 分析:

①不超过6位数的完全平方数用循环在10~999范围产生(for i:=10 to 999) ; ②将完全平方数 (i*i)转成字串类型存入s中;

③逐个取s的左右字符,检查是否相同(对称),检查对数不超过总长度的一半; ④如果是回文数,就调用打印过程(Print)。

Program Exam12;

Var n, k, j ,t : integer;

s : string; {字符串类型 }

i: longint; {长整数类型 }

Procedure Print; {打印过程(无形参)}

begin

write(s : 10); inc(t); {打印s, 用t 计数 }

if t mod 6=0 then writeln

{打印6个换行 }

end;

Begin

t:=0;

for i:=10 to 999 do

begin

str(i*i,s); {将完全平方数转换成字串 }

k:=length(s); {计算字串长度 }

n:=k div 2; {计算字串长度的一半 }

j:=1;

while j < = n do {取左右字符检查是否对称 }

if copy(s,j,1) < > copy(s,k+1-j,1) then j:=1000

else inc( j ) ; {若不对称让j=1000,退出循环 }

if j <1000 then Print { j <1000即是回文数,调打印 }

end;

writeln; writeln('Total=':8, t); {打印总个数 }

readln

End.

3、[例2-12]将合数483的各位数字相加(4+8+3)=15,如果将483分解成质因数相乘: 483=3*7*23,把这些质因数各位数字相加(3+7+2+3),其和也为15。即某合数的各位数字之和等于它所有质因数的各数字之和。求500以内具有上述特点的所有合数。

分析:

要建立以下几个过程:

(1)过程1:要分离X上的各个数字并求和

(2)过程2:分解因子并求所有因子数字和

(3)过程3:判断是否为素数

program exam45;

var n,t1,t2,tatol: integer;

yes: boolean;

procedure sub1(x:integer; var t:integer);

{过程:分离x的各位数字 }

begin

{并求各位数字之和 }

repeat

t:=t+x mod 10;

x:=x div 10;

until x=0

end;

procedure sub2(x: integer; var t: integer); {过程:分解质因数 }

var xx,tt:integer;

begin

xx:=2;

while x>1 do

if x mod xx=0 then

begin

tt:=0;

sub1(xx,tt);

t:=t+tt;

x:=x div xx

end

else inc(xx)

end;

procedure sub3(x: integer;var yy: boolean); {过程:判断x是否为素数 }

var k,m: integer;

begin

k:=trunc(sqrt(x));

for m:=2 to k do

if x mod m=0 then yy:=false;

end;

begin {主程序}

for n:=1 to 500 do

begin

t1:=0;t2:=0;

yes:=true;

sub3(n,yes); {调用过程求素数 }

if not yes then {如果非素数就… }

begin

sub1(n,t1); {调用过程求n的各位数字之和 }

sub2(n,t2);{调用过程求n的各质因数的数字之和 }

if t1=t2 then write(n:6); {打印合格的合数 } end

end;

readln

end.

4、[问题描述]:

已知:Sn= 1+1/2+1/3+…+1/n。显然对于任意一个整数K,当n足够大的时候,Sn大于K。

现给出一个整数K(1<=k<=15),要求计算出一个最小的n;使得Sn>K。

[输入]

键盘输入 k

[输出]

屏幕输出 n

[输入输出样例]

输人:1

输出:2

[问题分析]:

这道题目非常简单,题目的意思已经把该题的算法描述得再清楚不过了,初始时Sn=0,n=0,然后每次循环n?n+1,Sn?Sn+1/n,,直到Sn大于K,最后输出K。另外实型(Real是最慢的,建议用Extended)的运算速度不是很快,而K为1~15之间的整数,所以最后可以交一张表(常量数组),以达到最好的效果

program c1;

var

K: Byte;

n: Longint;

Sn: Extended;

begin

Readln(K);

Sn := 0; n := 0;

Repeat

Inc(n);

Sn := Sn + 1 / n;

Until Sn > k;

Writeln(n);

end.

5、陶陶摘苹果

【问题描述】

陶陶家的院子里有一棵苹果树,每到秋天树上就会结出10个苹果。苹果成熟的时候,陶陶就会跑去摘苹果。陶陶有个30厘米高的板凳,当她不能直接用手摘到苹果的时候,就会踩到板凳上再试试。

现在已知10个苹果到地面的高度,以及陶陶把手伸直的时候能够达到的最大高度,请帮陶陶算一下她能够摘到的苹果的数目。假设她碰到苹果,苹果就会掉下来。

【输入文件】

输入文件apple.in包括两行数据。第一行包含10个100到200之间(包括100和200)的整数(以厘米为单位)分别表示10个苹果到地面的高度,两个相邻的整数之间用一个空格隔开。第二行只包括一个100到120之间(包含100和120)的整数(以厘米为单位),表示陶陶把手伸直的时候能够达到的最大高度。

【输出文件】

输出文件apple.out包括一行,这一行只包含一个整数,表示陶陶能够摘到的苹果的数目。

【样例输入】

100 200 150 140 129 134 167 198 200 111

110

【样例输出】

5

分析:

。由于数据范围都不超过200,用integer完全就足够了,具体步骤如下:

1. 读入

2. 循环 1 to 10

3. 判断,找出最优解

4. 输出

【程序清单】

program apple;

var

i,n,s:integer;

a:array[1..10] of integer;

begin

assign(input,'apple.in');

reset(input);

for i:=1 to 10 do read(a[i]);

read(n);

s:=0;

for i:=1 to 10 do

if n+30>=a[i] then s:=s+1;

close(input);

assign(output,'apple.out');

rewrite(output);

write(s);

close(output);

end.

附加题:

高精度加法、减法、乘法

请计算354684645634131和8784316546168747687848364354这两个数相加、相减及相乘的值是多少

解题分析

(1)多精度数的表示:

用一维数组存放多精度数,每一个数组元素存放一位数字,其个位放在最后一个元素。用数组int[1..n]表示多精度数,通过文件(如果文件不会用,可以直接用键盘读入),放入数组int中。

(2)求和,用g表示进位,初始值为0。

(3)多精度的输出。

样例程序(程序为加法,减法和除法可根据这个修改) Program ex1(input,output);

const max=250;

var s1,s2:string;

a,b,c:array[1..max] of byte;

l1,l2,l,i:integer;

begin

writeln('input two large integer:');

readln(s1);

readln(s2);

l1:=length(s1);

l2:=length(s2); {用字符串方式读入两个高精度数} for i:=1 to max do

begin

a[i]:=0;

b[i]:=0;

c[i]:=0;

end;

for i:=1 to l1 do a[i]:=ord(s1[l1+1-i])-48;

for i:=1 to l2 do b[i]:=ord(s2[l2+1-i])-48;

if l1>l2 then l:=l1 else l:=l2;

for i:=1 to l do c[i]:=a[i]+b[i];

for i:=1 to l do

if c[i]>=10 then

begin

c[i]:=c[i]-10;

c[i+1]:=c[i+1]+1;

end;

if c[l+1]>0 then l:=l+1;

write('add=');

for i:=l downto 1 do write(c[i]);

readln;

end.

网站首页网站地图 站长统计
All rights reserved Powered by 海文库
copyright ©right 2010-2011。
文档资料库内容来自网络,如有侵犯请联系客服。zhit326@126.com