版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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«
现给出一个整数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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024-2030年中国建筑玻璃行业发展分析及发展趋势预测与投资风险研究报告
- 2024-2030年中国康复器具行业发展分析及行业投资前景预测研究报告
- 2024-2030年中国废旧材料行业市场深度调研及投资前景与投资策略研究报告
- 2024-2030年中国床上用品行业产销运行效益及发展商机创新性报告
- 2024-2030年中国平移门电机行业市场现状分析及竞争格局与投资发展研究报告
- 2024-2030年中国干虾皮市场竞争优势及未来投资动向预测报告
- 2024-2030年中国干变压器行业供需现状剖析与发展策略机遇报告
- 2024-2030年中国左奥硝唑市场销售模式分析与投资风险运行报告
- 2024-2030年中国工业触摸屏显示器行业市场发展趋势与前景展望战略分析报告
- 2024-2030年中国工业级亚硒酸钠行业前景动态与投资效益预测报告
- 支气管支架植入护理
- 会阴血肿护理查房
- 2024年国电投核能有限公司招聘笔试参考题库含答案解析
- 《电机与电器》期末考试复习题库(含答案)
- (外研版)高一英语必修1(全册)同步练习汇总
- 建设工程项目-月度安全检查表
- 食品安全监管研究
- 劳模和工匠人才创新工作室联盟 章程
- 老旧小区改造复工自查报告
- 基于PLC对邮件分拣系统的控制
- 农产品质量安全-第5章-农产品产地安全
评论
0/150
提交评论