PASCAL竞赛辅导习题二 问题1Word文档下载推荐.docx

上传人:b****6 文档编号:20174123 上传时间:2023-01-17 格式:DOCX 页数:18 大小:21.71KB
下载 相关 举报
PASCAL竞赛辅导习题二 问题1Word文档下载推荐.docx_第1页
第1页 / 共18页
PASCAL竞赛辅导习题二 问题1Word文档下载推荐.docx_第2页
第2页 / 共18页
PASCAL竞赛辅导习题二 问题1Word文档下载推荐.docx_第3页
第3页 / 共18页
PASCAL竞赛辅导习题二 问题1Word文档下载推荐.docx_第4页
第4页 / 共18页
PASCAL竞赛辅导习题二 问题1Word文档下载推荐.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

PASCAL竞赛辅导习题二 问题1Word文档下载推荐.docx

《PASCAL竞赛辅导习题二 问题1Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《PASCAL竞赛辅导习题二 问题1Word文档下载推荐.docx(18页珍藏版)》请在冰豆网上搜索。

PASCAL竞赛辅导习题二 问题1Word文档下载推荐.docx

C厂的代表说:

A厂的产品质量最次。

D厂的代表说:

C厂的产品不是最好的。

E厂的代表说:

D厂的产品会获得第一名。

公布结果后,证明只有产品获第一名和第二名的两个厂的代表猜对了。

求5个厂产品各获第几名。

【答案】ABCDE

52134

if(e<

>

2)and(e<

3)and(a*b*c*d*e=120)then

if(ord(e=1)+ord(b=2)+ord(a=5)+ord(c<

1)+ord(d=1)=2)and

(ord((e=1)and((a=1)or(a=2)))+

ord((b=2)and((b=1)or(b=2)))+

ord((a=5)and((c=1)or(c=2)))+

ord((c<

1)and((d=1)or(d=2)))+

ord((d=1)and((e=1)or(e=2)))

=2)then

b:

c:

d:

e:

问题3

逻辑判断

\v谁是小偷\a问题3\a

\v谁获冠军?

\a问题1\a

\v猜测产品质量评奖\a问题2\a

问题3

【问题】有A、B、C、D四名偷窃嫌疑犯,其中一人是小偷,审问中,A说:

“我不是小偷”,B说:

“C是小偷”,C说:

“小偷肯定是D”,D说:

“C在冤枉人”,有三人说真话,一人说假话,问到底谁是小偷?

varthief:

char;

forthief:

='

A'

to'

D'

do

iford(thief<

)+ord(thief='

C'

)+

ord(thief<

)=3thenwriteln('

TheThiefis:

'

thief);

问题4

字母塔

【问题】输出由字母组成的“字母塔”。

例如:

输入C,则输出:

A

ABA

ABCBA

ABCDCBA

vari,zimu,j,k:

repeat

inputachar:

);

readln(zimu);

zimu:

=upcase(zimu);

until(zimu>

)and(zimu<

Z'

fori:

tozimudobegin

write('

:

(ord(zimu)-ord(i))+1);

{留空格}

forj:

toidowrite(j);

{顺序写字母}

=pred(i)downto'

write(j);

{逆序写字母}

if(ord(i)-64)mod25=0then

readln{如超一页,要暂停分页显示}

elsewriteln;

问题5

进制1

【题目】键盘输入一个十进制的整数,及确定进制n,把这个数转换成相应的n进制输出。

(其中2〈=n〈=16)

输入10,n=3则输出(10)10=(101)3

vari,j,m,n:

longint;

array[1..100]ofbyte;

{用数组存放求出的余数}

inputm,n'

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

readln(m,n);

write(m);

i:

=0;

=i+1;

a[i]:

=mmodn;

m:

=mdivn;

untilm=0;

=('

=idownto1do

ifa[j]>

9thenwrite(chr(a[j]+55)){如果大于9,用字母输出}elsewrite(a[j]);

)'

n);

readln;

问题6

进制2

【题目】把n进制的数化回十进制表示

如(10101)2=(21)10

varcf,s,i,j,n:

string[20];

array[1..20]ofbyte;

{用字符串接收要转换的数}

=1tolength(m)do

begin{把字符串换成数字,注意字母时的情况}

if(m[i]<

9'

)and(m[i]>

0'

)then

a[i]:

=ord(m[i])-48;

if(upcase(m[i])<

F'

)and(upcase(m[i])>

=ord(upcase(m[i]))-55;

ifa[i]>

=nthen

begin

Error,Invaildm!

halt;

{如果含有不在n进制内的字符,则判为出错。

如2进制的数,则不应出现诸如10102,110031210等情况}

cf:

=1;

s:

=a[length(m)];

{cf:

乘方}

=length(m)-1downto1do

begin{从低位向高位,逐步转换}cf:

=cf*n;

{s记录得出来的数}s:

=s+a[i]*cf;

('

m,'

n,'

s);

问题7

进制3

【题目】任意进制间的互化。

把n进制的M转化成k进制表示

如m=ffn=16k=2

则有(ff)16=(11111111)2

vars,n,k:

procedurefirst(m:

string;

n:

integer);

{把数m化成十进制}

varcf,i,j:

=1tolength(m)dobegin

)thena[i]:

=nthenbeginwriteln('

end;

=length(m)-1downto1do

begin

s:

s,'

)10'

proceduresecond(m,n:

longint);

{把十进制的数化成k进制}vari,j:

9thenw

rite(chr(a[j]+55))

elsewrite(a[j]);

inputm,n,k:

{m:

数,n:

原先进制,k:

化成什么进制}readln(m,n,k);

first(m,n);

{把n进制的m化成十进制数S}

second(s,k);

{把S化成k进制}

问题8

钞票换硬币

【题目】把一元钞票换成一分、二分、五分硬币(每种至少一枚),有哪些种换法?

【答案】461种

vari,j,k,total:

integer;

total:

{总数设为0}

=1to99do{i:

二分硬币最多99枚}

=1to49do{j:

二分硬币最多49枚}

fork:

=1to19do{k:

五分硬币最多19枚}

ifi*1+j*2+k*5=100then

writeln(i:

3,j:

3,k:

3);

inc(total);

{总数加1}

writeln(total);

问题9

百钱买百鸡

【题目】一只公鸡值5元,一只母鸡值3元,3只小鸡值1元,现用一百元要买一百只鸡,问有什么方案?

【答案】四种方案:

公鸡母鸡小鸡

①02575

②41878

③81181

④12484

问题10

分书问题

【题目】有A、B、C、D、E五本书,要分给张、王、刘、┏━┯━┯━┯━┯━┯━┓

赵、钱五位同学,每人只能选一本,事先让每人把自┃│A│B│C│D│E┃己喜爱的书法填于右表,编程找出让每人都满意的方┠─┼─┼─┼─┼─┼─┨案。

┃张│││√│√│┃┠─┼─┼─┼─┼─┼─┨【答案】四种方案┃王│√│√│││√┃张王刘赵钱┠─┼─┼─┼─┼─┼─┨①CABDE②DACBE③DBCAE④DECAB【参考程序】

varz,w,l,zh,q,total:

procedureoutput;

zhang:

chr(z+64));

writeln('

wang:

chr(w+64));

liu:

chr(l+64));

zhao:

chr(zh+64));

qian:

chr(q+64));

writeln;

inc(total);

forz:

=3to4do

forw:

if(w<

3)and(w<

4)then

┃刘││√│√││┃┠─┼─┼─┼─┼─┼─┨┃赵│√│√││√│┃┠─┼─┼─┼─┼─┼─┨│√│││√┃┃钱│┗━┷━┷━┷━┷━┷━┛

forl:

=2to3do

forzh:

=1to4do

ifzh<

3then

forq:

=2to5do

if(q<

3)and(q<

4)thenbegin

ifz+w+l+zh+q=15then

ifz*w*l*zh*q=120thenoutput;

write(total);

问题11

筛选法

【题目】统计楼梯级数。

一步跨二级多一级,一步跨三级多二级,如果分别用四、五、六、七去除级数分别余三、三、五、五。

要求用筛选法求这个楼梯最少有多少级。

【答案】383级

【参考程序1】

vara:

array[1..1000]ofboolean;

array[1..10]ofinteger;

k,i,n,t:

=2to1000doa[i]:

=true;

=2;

t:

b[1]:

b[2]:

b[3]:

=3;

b[4]:

b[5]:

=5;

b[6]:

{表示各种跨法的余数}

=2to1000do{每一次筛选都从头到尾}

ifa[k]=truethen

if(k-b[t])modn<

0thena[k]:

=false;

{把不可能情况筛去}

=n+1;

=t+1;

{下一种可能}

untiln>

7;

{一共筛7次}

=2to1000doifa[i]=truethenbeginwrite(i:

5);

halt;

【参考程序2】

constmax=1000;

vari:

array[1..max]of0..7;

repeat

=i+2;

=a[i]+1;

untili>

max;

{一步跨二级}

i:

repeat

=i+3;

untili>

{三}i:

repeati:

=i+4;

{四}i:

=i+5;

{五}i:

=i+6;

{六}i:

=i+7;

{七}fori:

=1tomaxdoif(a[i]=6)thenbeginwriteln(i);

end.{跨了6次的梯级便为所求}

【参考程序3】程序3是程序2的精简,具有比程序2更好的通用性。

constmax=1000;

array[2..7]ofbyte=(1,2,3,3,5,5);

{各种跨法剩余的级数}vari,j:

{置初值}

=2to7dobegin{从2级到7级}

=b[j];

=i+j;

{每一次可能跨到的级数}

{某级跨到一次,记录一次}

{从头跨到尾}

=1tomaxdo

if(a[i]=6)then{跨了6次的梯级便为所求}

beginwriteln(i);

{找到第一个满足条件的便可结束程序}end.

问题12

求最大公约数

【题目】求两个正整数的最大公约数

【算法】用辗转相除法(参看P40例3)

varm,n,r,t:

if(n<

=0)or(m<

=0)thenbeginwriteln('

error!

ifm<

nthenbegint:

=m;

=n;

=t;

{大数放m,小数放n}r:

=mmodn;

{r:

余数}

whiler<

0dobegin

=r;

r:

yushu:

问题13

素数2

【问题】任给一个自然数n,求出这个自然数不同因数的个数。

例如n=6时,因为1,2,3,6这四个数均是6的因数,故输出为total=4。

【算法】类似判断素数的方法。

如果发现n有一个≤sqr(n)的因数,必然同时有一个≥sqr(n)的因数。

例如:

6有一个因数2,则必有另一因数3。

因为2*3=6

varn,nums,k,i:

inputn:

readln(n);

ifn<

=0thenwriteln('

N>

0!

!

0;

k:

=trunc(sqrt(n));

nums:

=2tokdo

ifnmodi=0thennums:

=nums+2;

ifn=sqr(k)thendec(nums);

nums);

问题14

万年历

【题目】输入年、月、日,求这一天是星期几。

【算法提要】求出这一天离公元1年的元旦有多少天days,然后对7求余const

first=1;

{公元1年为基准}

first_week=1;

{公元1年的元旦为星期一}

yue:

array[1..12]of1..31=(31,28,31,30,31,30,31,31,30,31,30,31);

week_:

array[0..6]ofstring[20]=('

Sunday'

'

Monday'

Tuesday'

Wedsday'

'

Thursday'

Friday'

Saturday'

var

days,week,year,month,date,i,years:

year:

readln(year);

month'

readln(month);

date'

readln(date);

years:

days:

=firsttoyear-1do

if(imod400=0)or(imod4=0)and(imod100<

0)then

beginyears:

=years+1;

{注意处理闰年的情况}

days:

=(year-first)*365+years;

{离基准年过了多少天}

=1tomonth-1dodays:

=days+yue[i];

{本年过了多少个月}

=1todatedodays:

=days+1;

{本月过了多少天}

if((yearmod400=0)or(yearmod4=0)and(yearmod100<

0))

and(month>

3)thendays:

{如果本年为闰年,且月份超2月,还要考虑加1}

week:

=((days-1)mod7+first_week)mod7;

{求星期数}

itis'

week_[week]);

【参考程序2】用公式法:

=trunc((year-1)*(1+1/4-1/100+1/400)+c)

用求出的days对7求余数。

其中c为该天离该年元旦的天数const

days,week,year,month,date,i:

0))and(month>

=trunc((year-1)*(1+1/4-1/100+1/400)+days);

=daysmod7;

问题15

猴子选大王

【问题】n只猴子选大王,选举办法如下:

从头到尾1,2,3报数,凡报3的退出,余下的从尾到头1,2,3报数,凡报3的退出...如此类推,当剩下两只猴子时,取这时报1的为王,若想当猴王,请问当初应占据什么位置?

【测试数据】

n│7│10│20│100│

──┼─┼─┼─┼──┼

位置│2│8│16│77│

constnumber=3;

varn,num,i,total:

array[1..100]ofboolean;

order:

boolean;

{队伍中剩下的猴子数}

=1tondoa[i]:

order:

{order=true:

顺序报数}

num:

{num:

报的数字}

fori

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 幼儿教育 > 幼儿读物

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1