NO IP辅导提高程序汇集试题之一_第1页
NO IP辅导提高程序汇集试题之一_第2页
NO IP辅导提高程序汇集试题之一_第3页
NO IP辅导提高程序汇集试题之一_第4页
NO IP辅导提高程序汇集试题之一_第5页
已阅读5页,还剩85页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

NOIP辅导提高程序汇集试题之一

目录

001.国王杀戮问题036.背包问题

002.级数求和037.雇佣工人

003.找自然数N038.求三位数

004.求字符的逆序039.联合求公约和公倍

005.判断质数040.开关灯

006.不高兴的津津041.正方形与长方形个数

007.陶陶摘苹果042.盒子装小球

008.乒乓球043.N立方

009.明明的随机数044.骨牌的铺法

010.截钢管(FOR循环)045.棋盘的路径

011.截钢管(WHILE循环)046.到天宫做客

012.津津的储蓄计划047.分数变小数

013.最多奖学金048.取数方案

014.高精度加减049.最小乘车费用

015.一元一次方程求解050.排序与次序

016.校门外的树051.统计字符串并排序

017.排序052.纪念品分组

018.素数问题053.字符串的回文

019.歌德巴赫猜想054.统计字符和数字等

020.素数猜想055.寻求三位数

021.卡布列卡猜想056.连续自然数和

022.验证数学命题057.球赛门票

023.回文数猜想058.锻炼计划

024.输出年、月、日059.单词解密

025.删数问题060.ISBN号码

026.求最大公约数061.笨小猴

027.求最小公倍数062.新数字游戏

028.奖学金063.开心的金明

029.约数求和064.子数整数

030.数的计算065.车厢重组

031.文件操作066.阶乘问题

032.邮票面值067.进制转换

033.火车站上下人数068.翻转硬币

034.通过沙漠069.波浪数

035.约瑟夫问题070.连续自然数和

附:pascal各种函数

第1题

传说中有一个残暴的国王,喜欢杀戮百姓。有一次,他抓到30个百姓并要一一杀掉。在这30

个百姓中间有一个聪明人,他站出来对国王说:“请国王大发慈悲,赦免二人不死。”国王问:“赦免

哪二人不死?”那个聪明人回答说:“我们30个人围成一圈,从1开始报数,凡数到5的人就拉出

去杀掉。剩下的人继续从1开始报数,循环反复,直到剩下两个人为止,这两个人被赦免。”国王一

听很有意思,采纳了聪明人的建议,赦免了两个人,而那个聪明人就是其中之一。请你设计一个程

序,由计算机判断聪明人要站在什么位置,才能躲过这一场屠杀。

问题分析:

首先,设百姓的人数为M人,设数到N的人被杀掉。用数组A(M)存放M个人是否还在圈中的

信息。其中,A(i)=1表示第i个人还在圈中。A(i)=0表示第i个人已被杀掉。开始时,数

组A中所有的元素都是1,表示每个人都站在圈中。用1(=1(+八(i)来实现报数功能,因为只有还

在圈中的人才能使K的值增加。用变量D来记录出圈的人数,当D=M时,表示所有的人都出圈了。

最后出圈的两个人就是被赦免的人。

Programx0i00_05;

vara:array[1..m]ofinteger;

i,d,k,p:integer;

begin

readln(m,n);305

fori:=1tomdo

a[i]:=1;

d:=0;k:=0;

whi1edOmdo

begin

fori:=1tomdo

begin

k:=k+a[i];

ifk<>nthencontinue;

write(i:4);

P:=P+1;

ifp=5thenbeginp:=0;writein;end;

a[i]:=0;

k:=0;

d:=d+1;

ifd=mthenexit;

end;

end;{while)

end.

第2题:

[问题描述]:

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

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

[输入]

键盘输入k

[输出]

屏幕输出n

[输入输出样例]

输人:1

输出:2

参考程序

programp021(input,output);

varn:longint;

s:real;

k:integer;

begin

assign(input,*pl.in,);

reset(input);

readln(k);

close(input);

n:=0;s:=0;

whiles<=kdo

begin

n:=n+l;

s:=s+l/n;

end;

assign(output,*pl.out');

rewrite(output);

writein(n);

close(output);

end.

第3题:

问题描述

我们要求找出具有下列性质数的个数(包含输入的自然数n):

先输入一个自然数n(n〈=1000),然后对此自然数按照如下方法进行处理:

1.不作任何处理;

2.在它的左边加上一个自然数,但该自然数不能超过原数的一半;

3.加上数后,继续按此规则进行处理,直到不能再加自然数为止.

样例:输入:6

满足条件的数为6(此部分不必输出)

16

26

126

36

136

输出:6

参考程序

programp2001_l(input,output);

constmaxn=1000;

vari,j,n:integer;

f:array[1..maxn]oflongint;

begin

assign(input,*count,in);

reset(input);

readln(n);

close(input);

fori:=2tondiv2do

begin

forj:=ltoidiv2do

end;

f[n]:=1;

fori:=1tondiv2do

f[n]:=f[n]+f[i];

assign(output,*count.out');

rewrite(output);

writein(f[n]);

close(output);

end.

第4题

求字符的逆序:编写一程序,使其功能是输入若干行字符串,每入•行,就按逆序输出该行,最后

遇到T终止。

参考程序

Programnixu;

var

line:string[100];

kz:integer;

procedurereverse(vars:strl);

var

I,j:integer;

t:char;

begin

i:=l;

j:=length(s);

while(i<j)do

begin

t:=s;

s:=s[j];

s[j]:=t;

inc(i);

dec(j);

end;

end;

begin

writeIn('continue?Tforend.');

readln(kz);

while(kzO-l)do

begin

readln(1ine);

reverse(line);

writeln(line);

writeln("continue?-1forend.');

readln(kz);

end;

end.

第5题

题目描述:给出一个正整数,判断这个数是否是质数。

输入:-个正整数n(lWnW10000),

输出:如果n是质数,输出“YES”;否则,输出“NO”。

输入样例:10

输出样例:NO

programsushu;

var

n,i:integer;

begin

writein('pleaseinputanumbern(l<=n<=10000):?)

read(n);

ifn=2thenwritein('YES')

elseif(n=l)or(nmod2=0)thenwritelnCNO')

elsebegin

i:=3;

whilei*i<=ndo

begin

ifnmodi=0then

begin

writein('NO');

exit;

end;

i:=i+2;

end;

writeinCYES');

end;

第6题

不高兴的津津(unhappy,pas/dpr/c/cpp)

【问题描述】

津津上初中了。妈妈认为津津应该更加用功学习,所以津津除了上学之外,还要参加妈妈为她报名

的各科复习班。另外每周妈妈还会送她去学习朗诵、舞蹈和钢琴。但是津津如果一天上课超过八个

小时就会不高兴,而且上得越久就会越不高兴。假设津津不会因为其它事不高兴,并且她的不高兴

不会持续到第二天。请你帮忙检查一下津津下周的日程安排,看看下周她会不会不高兴;如果会的

话,哪天最不高兴。

【输入文件】

输入文件unhappy.in包括七行数据,分别表示周到周日的日程安排。每行包括两个小于10的非

负整数,用空格隔开,分别表示津津在学校上课的时间利妈妈安排她上课的时间。

【输出文件】

输出文件unhappy,out包括一行,这一行只包含一个数字。如果不会不高兴则输出0,如果会则输

出最不高兴的是周儿(用1,2,3,4,5,6,7分别表示周一,周二,周三,周四,周五,周六,

周日)。如果有两天或两天以上不高兴的程度相当,则输出时间最靠前的一天。

【样例输入】

53

62

72

53

54

04

06

【样例输出】

3

参考程序

programunhappy(input,output);

vari,k,max:integer;

a,b:integer;

begin

assign(input,'unhappy,in');

reset(input);

assign(output,*unhappy.out');

rewrite(output);

k:=0;max:=8;

fori:=1to7do

begin

readln(a,b);

ifa+b>maxthenk:=i;

end;

write(k);

close(input);

close(output);

end.

第7题

陶陶摘苹果(apple.pas/c/cpp)

【问题描述】

陶陶家的院子里有一棵苹果树,每到秋天树上就会结出10个苹果。苹果成熟的时候,陶陶就会

跑去摘苹果。陶陶有个30厘米高的板凳,当她不能直接用手摘到苹果的时候,就会踩到板凳上再试

试。现在已知10个苹果到地面的高度,以及陶陶把手伸直的时候能够达到的最大高度,请帮陶陶算

一下她能够摘到的苹果的数目。假设她碰到苹果,苹果就会抻下来。

【输入文件】

输入文件apple,in包括两行数据。第一行包含10个100到200之间(包括100和200)的整数(以

厘米为单位)分别表示10个苹果到地面的高度,两个相邻的整数之间用一个空格隔开。第二行只包

括一个100到120之间(包含100和120)的整数(以厘米为单位),表示陶陶把手伸直的时候能够

达到的最大高度。

【输出文件】

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

【样例输入】

100200150140129134167198200111

110

【样例输出】

5

参考程序

programapp1e;

vara:array[1..10]ofinteger;

n,i,total:integer;

begin

assign(input,'apple,in*);

assign(output,?apple,out');

reset(input);

rewrite(output);

fori:=1to10doread(a[i]);

readln(n);

n:=n+30;

forI:=1to10do

ifn>=a[i]theninc(total);

writeln(total);

close(input);

close(output);

End.

第8题

乒乓球(Table,pas)

【问题背景】国际乒联现在主席沙拉拉自从上任以来就立志于推行一系列改革,以推动乒乓球运动

在全球的普及。其中11分制改革引起了很大的争议,有一部分球员因为无法适应新规则只能选择退

役。华华就是其中一位,他退役之后走上了乒乓球研究工作,意图弄明白11分制和21分制对选手

的不同影响。在开展他的研究之前,他首先需要对他多年比赛的统计数据进行一些分析,所以需要

你的帮忙。

【问题描述】华华通过以下方式进行分析,首先将比赛每个球的胜负列成一张表,然后分别计算在

11分制和21分制下,双方的比赛结果(截至记录末尾)。

比如现在有这么一份记录,(其中W表示华华获得一分,L表示华华对手获得一分):

WWIVWWWWWWWWWWWWWWWWLW

WWWWWWWWWWWWWWWWWLW

在11分制下,此时比赛的结果是华华第一局11比0获胜,第二局11比0获胜,正在进行第三局,

当前比分1比1。而在21分制下,此时比赛结果是华华第一局21比0获胜,正在进行第二局,比

分2比1。如果一局比赛刚开始,则此时比分为0比0。你的程序就是要对于一系列比赛信息的输入

(WL形式),输出正确的结果。

【输入格式】每个输入文件包含若干行字符串(每行至多20个字母),字符串有大写的W、L和E组

成。其中E表示比赛信息结束,程序应该忽略E之后的所有内容。

【输出格式】输出由两部分组成,每部分有若干行,每一行对应一局比赛的比分(按比赛信息输入

顺序)。其中第一部分是11分制下的结果,第二部分是21分制下的结果,两部分之间由一个空行分

隔。

【输入样例】

WWWWWWWWWWWWWWWWWWWW

WWLWEWWWW

【输出样例】

11:0

11:0

1:1

21:0

2:1

参考程序

programp2003_l;

proceduretran(fen:integer);

vartemp:char;

w,L:integer;

first:boolean;

begin

w:=0;L:=0;

first:=true;

read(temp);

whiletempO*E*do

begin

iftemp='W'thenw:=w+l

elseiftemp='L'thenL:=L+1;

if((w>=fen)or(L>=fen))and(abs(w-L)>=2)then

begin

writein(w,':,1);

w:=O;L:=O;

first:=false;

end;

read(temp);

end;

writeIn(w,':',L);

end;

begin

assign(input,'table,in);

reset(input);

assign(output,'table,out');

rewrite(output);

tran(ll);

writein;

tran(21);

close(input);

close(output);

end.

第9题

明明的随机数

(random,pas/c/cpp)

【问题描述】

明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了N个1

到1000之间的随机整数(NW100),对于其中重复的数字,只保留一个,把其余相同的数去掉,不

同的数对应着不同的学生的学号。然后再把这些数从小到大排序,按照排好的顺序去找同学做调查。

请你协助明明完成“去重”与“排序”的工作。

【输入文件】

输入文件random,in有2行,第1行为1个正整数,表示所生成的随机数的个数:N

第2行有N个用空格隔开的正整数,为所产生的随机数。

【输出文件】

输出文件random,out也是2行,第1行为1个正整数M,表示不相同的随机数的个数。第2行为M

个用空格隔开的正整数,为从小到大排好序的不相同的随机数。

【输入样例】

10

2040326740208930040015

【输出样例】

8

152032406789300400

参考程序

programkk(input,output);

var

i,j,x,n,m:integer;

a:array[1..100]ofinteger;

begin

readln(n);

fori:=1tondo

begin

a[i]:=trunc(random*10)+1;

write(a[i],'');

end;

writein;

fori:=1ton-ldo

forj:=i+ltondo

begin

ifa[i]=a[j]thena[i]:=0;

ifa[i]>a[j]thenbegin

x:=a[i];

a[i]:=a[j];

a[j]:=x;

end;

end;

fori:=ltondo

ifa[i]<>0thenm:=m+l;writeIn(m);

fori:=1tondo

ifa[i]<>0thenwrite(a[i],*');

end.

第10题

将一根长为369cm的钢管截成长为69cm和39cm两种规格的短料。在这两种规格的短料至少

各截一根的前提下,如何截才能余料最少。

提示:设两种规格的短料分别为:

规格为69cm的x根,可在1至(369-39)/69范围循环取值;

规格为39cm的y根,用y=(369-69*X)/3为计算;

余料R=369-69*X-39*Y。

①设最小余料的初始值min=369;

②在X循环范围内,每一个X值都计算出对应的丫利R;

③如果RVmin,就将R存入min,x存入n,y存入m,记录余料最小时的x和y;

④重复步骤②,当x值超出((369-39)/69)时结束循环。

要求:先用for循环完成程序。然后用while完成程序。认真比较for和while的用法。

参考程序for循环

programww;

var

min,x,y,r:integer;

begin

min:=369;

forx:=lto(369-39)div69do

begin

y:=(369-69*x)div39;

r:=369-69*x-39*y;

ifr<minthenbegin

min:=r;

n:=x;

m:=y;

end;

end;

writein('min=',min,'x=,,n,'y=',m);

readln

end.

第11题

将一根长为369cm的钢管截成长为69cm和39cm两种规格的短料在这两种规格的短料至少各截

一根的前提下,如何截才能余料最少。

提示:设两种规格的短料分别为:

规格为69cm的x根,可在1至(369-39)/69范围循环取值;

规格为39cm的y根,用y=(369-69*X)/39)计算;

余料R=369-69*X-39*Y。

①设最小余料的初始值min=369;

②在X循环范围内,每一个X值都计算出对应的Y和R;

③如果RVmin,就将R存入min,x存入n,y存入m,记录余料最小时的x和y;

④重复步骤②,当x值超出((369—39)/69)时结束循环。

参考程序while循环

programexam311;

varx,y,r,min,n,m,a:integer;

begin

min:=369;

a:=(369-39)div69;

x:=l;

whilex<=ado

begin

y:=(369-69*x)div39;

r:=369-69*x-39*y;

ifr<minthen

begin

min:=r;

n:=x;

m:=y

end;

inc(x);

end;

writein('min=',min,'x=,,n,'y=,,m);

readln

end.

小结for和while循环的特点:①.在for循环中,循环变量会自动累加,而while循环中,循环

变量不会自动累加,需要一个累加器使循环变量累加。②.在for循环中,循环变量的起始和终止条

件是可以从题中寻求得到,而while循环中的循环变量,是要设置循环终止值为结束的条件,而后

循环变量在逐步累加过程中,要逐步靠近循环终止值,使循环一步步完成。

第12题

津津的储蓄计划(Save.pas/dpr/c/cpp).

【问题描述】

津津的零花钱一直都是自己管理。每个月的月初妈妈给津津300元钱,津津会预算这个月的花

销,并且总能做到实际花销和预算的相同。为了让津津学习如何储蓄,妈妈提出,津津可以随时把

整百的钱存在她那里,到了年末她会加上20%还给津津。因此津津制定了一个储蓄计划:每个月的

月初,在得到妈妈给的零花钱后,如果她预计到这个月的月末手中还会有多于100元或恰好100元,

她就会把整百的钱存在妈妈那里,剩余的钱留在自己手中。

例如11月初津津手中还有83元,妈妈给了津津300元。津津预计11月的花销是180元,那么

她就会在妈妈那里存200元,自己留下183元。到了11月月末,津津手中会剩下3元钱。

津津发现这个储蓄计划的主要风险是,存在妈妈那里的钱在年末之前不能取出。有可能在某个

月的月初,津津手中的钱加上这个月妈妈给的钱,不够这个月的原定预算。如果出现这种情况,津

津将不得不在这个月省吃俭用,压缩预算。

现在请你根据2004年1月到12月每个月津津的预算,判断会不会出现这种情况。如果不会,

计算到2004年年末,妈妈将津津平常存的钱加上20%还给津津之后,津津手中会有多少钱。

【输入文件】

输入文件save,in包括12行数据,每行包含一个小于350的非负整数,分别表示1月到12月

津津的预算。

【输出文件】

输出文件save,out包括一行,这一行只包含一个整数。如果储蓄计划实施过程中出现某个月钱

不够用的情况,输出-X,X表示出现这种情况的第一个月:否则输出到2004年年末津津手中会有多

少钱。

【样例输入1]

290

230

280

200

300

170

340

50

90

80

200

60

【样例输出1】

-7

【样例输入2】

290

230

280

200

300

170

330

50

90

80

200

60

【样例输出2】

1580

参考程序

programsave(input,output);

vartotal,sum,i,c:integer;

s:array[1..12]ofinteger;

begin

assign(input,*save,in');

assign(output,Jsave,out');

reset(input);

rewrite(output);

total:=0;sum:=0;

fori:=1to12do

begin

total:=total+300;

readln(s[i]);

iftotal<s[i]thenbeginwrite(,,i);close(output);halt;end

elsebegin

total:=total-s[i];

c:=totaldiv100;

sum:=sum+c*100;

total:=total-c*100;

end;

end;

m:=total+sum+sum*0.2;

writein(m);

close(input);

close(output);

end.

第13题

谁拿了最多奖学金(scholar,pas/c/cpp)

【问题描述】

某校的惯例是在每学期的期末考试之后发放奖学金。发放的奖学金共有五种,获取的条件各自不同:

1)院士奖学金,每人8000元,期末平均成绩高于80分(>80),并且在本学期内发表1篇或1篇以

上论文的学生均可获得;

2)五四奖学金,每人4000元,期末平均成绩高于85分085),并且班级评议成绩高于80分(>80)

的学生均可获得;

3)成绩优秀奖,每人2000元,期末平均成绩高于90分(>90)的学生均可获得;

4)西部奖学金,每人1000元,期末平均成绩高于85分(>85)的西部省份学生均可获得;

5)班级贡献奖,每人850元,班级评议成绩高于80分(>80)的学生干部均可获得;只要符合条

件就可以得奖,每项奖学金的获奖人数没有限制,每名学生也可以同时获得多项奖学金。例如姚林

的期末平均成绩是87分,班级评议成绩82分,同时他还是一位学生干部,那么他可以同时获得五

四奖学金和班级贡献奖,奖金总数是4850元。

现在给出若干学生的相关数据,请计算哪些同学获得的奖金总数最高(假设总有同学能满足获得奖

学金的条件)。

【输入文件】

输入文件scholar.in的第一行是一个整数N(1<=N<=100),表示学生的总数。接下来的N行每

行是一位学生的数据,从左向右依次是姓名,期末平均成绩,班级评议成绩,是否是学生干部,是

否是西部省份学生,以及发表的论文数。姓名是由大小写英文字母组成的长度不超过20的字符串(不

含空格);期末平均成绩和班级评议成绩都是。到100之间的整数(包括0和100):是否是学生干

部和是否是西部省份学生分别用一个字符表示,丫表示是,N表示不是;发表的论文数是0到10的

整数(包括0和10)。每两个相邻数据项之间用一个空格分隔。

【输出文件】

输出文件scholar,out包括三行,第一行是获得最多奖金的学生的姓名,第二行是这名学生获得的

奖金总数。如果有两位或两位以上.的学生获得的奖金最多,输出他们之中在输入文件中出现最早的

学生的姓名。第三行是这N个学生获得的奖学金的总数。

【样例输入】

4

姓名成绩评议干部西部论文

YaoLin8782YN0

ChenRuiyi8878NY1

LiXin9288NN0

ZhangQin8387YN1

【样例输出】8000+1000

ChenRuiyi

9000

28700

题目概述:

己知每个学生的个人信息,求出获得奖学金最多的学生姓名、金额,以及全部奖学金金额。

算法分析:

模拟中涉及简单的字符处理,特别要注意数据类型的应用。如:学生姓名可采用char和string相

结合的方法处理,奖学金金额用longint较为适宜。

姓名,期末平均成绩,班级评议成绩,是否是学生干部,是否是西部省份学生,以及发表的论文

ZhangQin8387YN1

程序:

programscholar;

var

name:array[1..20]ofstring;

al,a2,a5:array[1..100]oflongint;

a3,a4:array[1..100]ofchar;

n,i,max,total,p:longint;

maxname:string;

ch:char;

f:text;

begin

assign(f,*scholar,in');reset(f);

readln(f,n);

fori:=1tondo

begin

read(f,ch);

whilech<>,'do

begin

name[i]:=name[i]+ch;

read(f,ch);

end;

readln(f,al[i],a2[i],a3[i],a4[i],a5[i]);

end;

close(f);

fori:=ltondo

begin

P:=0;

if,(al[i]>80)and(a5[i]>=1)theninc(p,8000);

if,(al[i]>85)and(a2[i]>80)theninc(p,4000);

if'(al[i]>90)theninc(p,2000);

if,(al[i]>85)and(a4[i]='Y')theninc(p,1000);

if,(a2[i]>80)and(a3[i]=,Y*)theninc(p,850);

if'p>maxthen

begin

max:=p;

maxname:=name[i];

end;

inc(total,p);tatol:=total+p;

end;

assign(f,'scholar,out');rewrite(f);

writein(f,maxname);

writein(f,max);

writein(f,total);

close(f);

end.

第14题

高精度问题

①.高精度的比较

比较的过程就是比较数的大小,

'2354856957458122654126541256784255646513'40

'3548647561236547561231354564561431234556534'43

integer-32767^32766

longint+11位〜T1位

存放高精度的时候学会利用数组

a,b:array[1..1000]ofinteger;

a[l]a[2]a[3]a[4]......a[1000]

b[l]b[2]b[3]b[4]......b[1000]

有1000个存储单元。

'2354856957458122654126541256784255646513'40

'3548647561236547561231354564561431234556534'43

a[40]:=3b[43]:=4

a[41]:=?b[44]:=?

length(ss);

aa:string;

bbzstring;

length(aa);length(bb);

4043

②.高精度的加法(while循环)

高精度所能计算机的最大数值范围是0-255位

programjia;

var

a,b,c:array[1..255]of0..9;

x,i,la,lb,1c:integer;

nl,n2:string;

'2354856957458122654126541256784255646513'40

'3548647561236547561231354564561431234556534,43

begin

writeC输入被加数:');readln(nl);

writeC输入加数:');readln(n2);

la:=length(nl);

lb:=length(n2);

fillchar(a,sizeof(a),0);

置数组a全部归0

fillchar(b,sizeof(b),0);

'2354856957458122654126541256784255646513'40

‘3’……3

'3548647561236547561231354564561431234556534'43

fori:=lto40do

a[la+l-i]:=ord(nl[i])-ordC0");

a[40]:=ord('2')-ord('O')=2-0=2

a[39]:=3

a[l]:=3

{上面的for循环,是使字符串nl中的所有字符型通过ord()转换成对■应的数字型,分别存放到数组

a中}

fori:=ltolbdob[lb+l-i]:=ord(n2[i])-ord(*0*);

{上面的for循环,是使字符串n2中的所有字符型通过ord()转换成对应的数字型,分别存放到数组

b中}

'2354856957458122654126541256784255646518140

'9498647561236547561231354564561431234556534143

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX52

a[40]..................................a[l]

i:=1;x:=0;

while(i<=la)or(i<=lb)do

begin

x:=xdiv10+a[i]+b[i];x=13

c[i]:=xmod10;c[l]:=2c[2]:=5c[3]:=0

i:=i+l;

end;

4041

ifla>lbthenlc:=la+l

elselc:=lb+l;42

write。结果是:‘);

fori:=lcdownto1dowrite(c[i]);

writein;

end.

③.高精度的减法(while循环)

program》或法;

var

a,b,c:array[1..200]of0..9;

x,i,la,lb,1c:integer;

nl,n2,n:string;

begin

readln(nl);

readln(n2);

la:=length(nl);

lb:=length(n2);

if(la<=lb)and(nl<n2))then

begin

n:=nl;

nl:=n2;

n2:=n;

i:=la;

la:=lb;

lb:=i;

write('-');

end;

(if条件判断串nl,n2谁做被减数和减数,做适当的调换位置}

fillchar(a,sizeof(a),0);

fillchar(b,sizeof(b),0);

fillchar(c,sizeof(c),0);

fori:=1toladoa[la+l-i]:=ord(nl[i])-ord(*05);

fori:=1tolbdob[la+l-i]:=ord(n2[i])-ord(?05);

J13656548569574581226541265412567842556465143

'98647561236547561231354564561431234556534'41

i:=1;x:=0;

while(i<=la)or(i<=lb)do

begin

x:=x+10+a[i]-b[i];x=8

c[i]:=xmod10;c[l]=8

x:=xdiv10-1;x=0

i:=i+l;

end;

ifla>lbthenlc:=la

elselc:=lb;

fori:=lcdownto1dowrite(c[i]);

writein;

end.

④.高精度加法(fOR循环)

fori:=1tolado

a[la+l-i]:=ord(s[i])-ord(,O');

{把字符串s转换成数字型存放于数组a中}

fori:=1tolbdob[lb+l-i]:=ord(s[i])-ord(,0*);

{把字符串s转换成数字型存放于数组b中}begin

ifla>=lbthenx:=la

elsex:=lb;

{判断两个数组的长短,以长的为基准进行加}

54651235465976549846525

al3--------albiO-----bl

fori:=1toxdo

begin

a[i]:=a[i]+b[i];

a[i+l]:=a[i+l]+a[i]divlO;

a[i]:=a[i]mod10;

end;

whilea[x+l]<>0do

x:=x+l;

la:=x;{最高位若有进位,则长度增加}

end;

⑤.高精度减法(for循环)

begin

fori:=1tolado

begin

ifa[i]<b[i]

thenbegin

dec(a[i+l]);

a[i]:=a[i]+10;

end;

a[i]:=a[i]-b[i];

end;

while(a[la]=0)and(la>l)do

dec(la);

end;

第15题

求一元二次方程ax-2+bx+c=0(a<>0)的实数根。

解析:方程的系数a,b,c决定了方程有无实数根,决定了实数根xl,x2的值。当12-4ac<0时

无实数解,否则有实数解。

1、a,b,c三个变量是通过键盘输入;

2、判断l/2-4ac<0是否小于0;

3、套用公式求解xl,x2.

4、平方根函数sqrt(x)

S:=sqr(b)-4*a*c

XI:=(-b+sqrt(s))/2*a

X2:=(-b-sqrt(s))/2*a

Xl:=-b/2*a

X2:=xl

XI:=-b/2*a+(sqrt(s)/2*a)!

X2:=-b/2*a-(sqrt(s)/2*a)!

参考程序:

programfcheng(input,output);

var

xl,x2,a,b,c.d:real;

begin

readln(a,b,c);

d:=b*b-4*a*c;

ifd>=0thenbegin

xl:=(-b+sqrt(d))/(2*a);

x2:=(-b-sqrt(d))/(2*a);

writein(*xl=,,xl,'x2=',x2);

end

elsewritein(Jnorealroots');

end.

第16题

校门外的树

【问题描述】

某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米。我们可以把马

路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置;数轴上的每个整数点,即0,1,

2,……,L,都种有一棵树。由于马路上有一些区域要用来建地铁。这些区域用它们在数轴上的起

始点和终止点表示。已知任•区域的起始点和终止点的坐标都是整数,区域之间可能有重合的部分。

现在要把这些区域中的树(包括区域端点处的两棵树)移走。你的任务是计算将这些树都移走后,

马路上还有多少棵树。【输入文件】输入文件tree,in的第一行有两个整数L(1<=L<=10000)

和M(1<=M<=100),L代表马路的长度,M代表区域的数目,L和M之间用一个空格隔开。接下

来的M行每行包含两个不同的整数,用一个空格隔开,表示一个区域的起始点和终止点的坐标。【输

出文件】输出文件tree,out包括一行,这一行只包含一个整数,表示马路上剩余的树的数目。【样

例输入】5003150300100200470471【样例输出】298【数据规模】对于20%的数据,区域之间没

有重合的部分;对于其它的数据,区域之间有重合的情况。

[参考程序]

题目讲解:这道题目如果用常规的搜索来做的话比较复杂,另外该题目的数据量不是非常大,所以

该题我们用数组来模拟实现。

programtree(input,output);

vartreel:array[0..10000]of0..1;

1,m,i,j,b,e:integer;fl,f2:text;

begin

assign(fl,'tree,in');

assign(f2,'tree,out');

reset(fl);rewrite(f2);

read(fl,1);

fori:=0to1dotreel:=l;

read(fl,m);

fori:=1tomdo

begin

read(fl,b,e);

forj:=btoedo

treel[j]:=0;

end;

j:=0;

fori:=0to1do

iftree1=1thenj:=j+l;

write(f2,j);

close(f1);

close(f2);

end.

第17题

排序

①.选择排序

fori:=lto100do

begin

read(x);

a[i]:=x;

end;

fori:=1ton-ldo

forj:=i+ltondo

ifa[i]<a[j]thenbegin

temp:=a[i];

a[i]:=a[j];

a[j]:=temp;

end;

fori:=lto100do

write(a[i]:5);

②.冒泡排序

fori:=1to100do

read(a[i]);

fori:=1ton-ldo

forj:=ndowntoi+1do

ifa[j]>a[j-l]thenbegin

temp:=a[j];

a[j]:=a[j-l];

:=temp;

end;

fori:=lto100do

write(a[i]:5);

③,快速排序

fori:=1to100do

read(a[i]);

i:=s;

J:=t;

x:=a[(i+j)div2];

repeat

whilea[i]<xdoinc(i);{找左边比他大的}

whilea[j]>xdodec(j);{找右边比他小的}

ifi<=jthen{交换}

begin

temp:=a[i];

a[j]:=temp;

inc(i);

dec(j);

end;

untili>j;

其中:inc(i);就是i:=i+l;

inc(a,b);就是a:=a+b;

dec(i):就是i:=i-l;

length(nl):测量字符串nl的长度;

fillchar(a,sizeof(a),0);

置数组a全部清空为0;

注意:①在排序过程中,一定要注意条件中是大于号还是小于号,大于号表示数列从大到小,小于

号表示从小到大。②选择排序过程中是从第一个数据开始依次向后进行比较,一趟找出一个最大值

或一个最小值③冒泡排序是从最后面两个数据开始比较,找出其中最大值或最小值,然后在往前推

进一个数据进行接着比较,再找出最大值或最小值,依次类推,直到第一个数据和第二个数据比较

完成为止,那么将会找出整个数列中的一个最大值或最小值。

第18题

素数问题

什么是素数:除了1和它本身之外不能被其他任何数整除的数称之为素数。

例如:求10000以内的所有素数?

programsushu;

var

i,j:integer;

p:boolean;

begin

fori:=2to10000do

begin

p:=true;

forj:=2totrunc(sqrt(i))do

ifimodj=0then

begin

p:二false;

break;

end;

ifpthenwrite(i:5);

end;

end.

第19题

猜想问题

验证歌德巴赫猜想:任一充分大偶数2*n,可以用两个素数之和表示。编程完成此猜想

2*N=P1+P2。

例如:

read(n);

x:=2*n;

fori:=2toxdo

begin

p:=true;

forj:=2totrunc(sqrt(i))do

ifimodj=0then

begin

p:=false;

break;

end;

ifpthenm:=i;

n:=x-i;

判断n是否为素数,如果是,则找到符合题意的两个素数。

end;

第20题

对称素数猜想:对于任意一个大于3的自然数N(n〉=4),总可以在它的左侧和右侧找到一个与

距离相等的素数,

N这样的一对素数被称为自然数N的对称素数。

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论