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

循环结构习题课2013

发布时间:2013-09-26 16:01:02  

条件、循环结构习题课
NOIP2013年暑期集训

基础回顾
1.循环结构的有关概念 反复执行 (1)定义:__________相同操作的结构. (2)组成:
反复执行 ?①循环体:在算法框图中_________的部分 循? ?②循环变量:控制着循环的___________的 开始和结束 环? ?变量 结? ?③循环的终止条件:判断框里的条件,判 构? 是否继续执行循环体 ?断____________________

2.用循环体来描述算法 在画出算法框图之前,需要确定三件事:

循环 初始 (1)确定_____变量和_____条件;
反复执行 循环体 (2)确定算法中_________的部分,即_______; 终止 (3)确定循环的_____条件.

有一堆100多个零件,如果3个3个数剩 2个,5个5个数剩3个,7个7个数剩5个, 请计算出这堆零件至少有多少个?

Program samp14; var a,b,s:integer; Begin For a:=100 to 200 do if (a mod 3=2) and(a mod 5=3) and (a mod 7=5) then write('a=',a); Readln; End.

输入一个自然数,求这个自然 数的所有约数之和

Program samp13; var a,b,s:integer; Begin write('input a='); readln(a); s:=0; For b:=1 to a do if a mod b=0 then s:=s+b; write('s=',s); Readln; End.

一个两位数x,将它的个位数字与 十位数字对调后得到一个新数y,此 时y恰好比x大36,请编程求出所有 这样的两位数。

Program ex34; var x,y,a,b:integer; Begin For x := 10 to 99 do Begin a := x div 10; b := x mod 10; y := b*10+a; if y-x=36 then writeln(x); End; Readln; End. 结果是:15,26,37,48,59

猴子吃桃问题:猴子第一天摘下若 干个桃子,当即吃了一半,还不瘾,又多 吃了一个;第二天早上又将剩下的桃子吃掉 一半,又多吃了一个。以后每天早上都吃 了前一天剩下的一半零一个。到第10天早 上想再吃时,见只剩下一个桃子了。求第 一天共摘了多少。

Program tao; var i,x1,x2:integer; begin for i:=1 to 10 do begin x1:=(x2+1)*2; x2:=x1; end; writeln(x2); end.

题目:
有5个人坐在一起,问第五个人多少岁?他 说比第4个人大2岁。问第4个人岁数,他说比第3 个人大2岁。问第三个人,又说比第2人大两岁。问 第2个人,说比第一个人大两岁。最后问第一个人, 他说是10岁。请问第五个人多大? Program suishu; var a,i:longint; begin a:=10; for i:=1 to 4 do a:=a+2; writeln(a); end.

齐王点兵的故事。 相传三齐王韩信才智过人,从不直 接清点自己军队的人数,只是让士兵 先后以三人一排、五人一排、七人一 排地变换队形,而他每次只掠一眼队 伍的排尾就知道总人数了(不超过 100人)。输入三次排尾的人数,输 出总人数。

program e2_36; var a,b,c,i:integer; begin writeln('shu ru p3(0~2),p5(0~4),p7(0~6) de wei shu:'); readln(a,b,c); for i:=100 downto 1 do if (i mod 3=a)and(i mod 5=b)and(i mod 7=c) then writeln(i); if i=1 then writeln('No answer!'); end.

多重

循环练习

编程序分别打印以下三图: (1) (2) ***** ***** ***** ***** ***** ***** ***** ***** ***** *****

(3) ***** ***** ***** ***** *****

? 【问题分析】 三个图形都是5行5列,因此可以用2重 循环来实现,但是三个图形又各有区别, 区别就在于每一行第一个星号之前的空格 数量有所不同,因此可以用空格数量来进 行控制.

【设计算法】
(1) (2) (3)

第一层循环i=1..5
第二层循环j=1..5 打印’*’ 第二层循环结束 换行 第一层循环结束

第一层循环i=1..5
第二层循环j=1..5 打印’*’ 第二层循环结束 换行 第一层循环结束

第一层循环i=1..5
第二层循环j=1..5 打印’*’ 第二层循环结束 换行 第一层循环结束

打印此行第一个*之前的空格 打印此行第一个*之前的空格

(1) Var I,j:integer; Begin For I:=1 to 5 do begin For j:=1 to 5 do begin Write(‘*’); End; Writeln; End; End.

(2) Var I,j:integer; Begin For I:=1 to 5 do begin Write(‘□’: i); For j:=1 to 5 do begin Write(‘*’); End; Writeln; End; End.

(3) Var I,j:integer; Begin For I:=1 to 5 do begin Write(‘□’:19I); For j:=1 to 5 do begin Write(‘*’); End; Writeln; End; End.

在屏幕上输出乘法口诀表

var i,j:integer; begin for i:=1 to 9 do begin for j:=1 to 9 do begin write(j,'*',i,'=',j*i,' '); end; writeln; end; end.

Program Exam4; Var a,b:integer; Begin for a:=1 to 9 do begin for b:=1 to a do write(b,'X',a,'=',a*b:2,' '); writeln end; Readln; End.

试编写能够打印输出如下图形的 程序。 AAAAAAAAA AAAAAAA AAAAA AAA A

program e; const n=5; var i,j:integer; begin writeln; for i:=1 to n do begin write('':i); for j:=1 to (n-i)*2+1 do write('A'); writeln; end; end.

满足a*a*a+b*b*b+c*c*c=abc的 数字称为水仙花数,求所有的100999之间的水仙花数。

打印出所有的“水仙花数”. 所谓“水仙花数”是指一个三位数, 其各位数字立方和等于该数本身。

Program shuixianhua; var a,b,c,i:integer; begin for i:=100 to 999 do begin a:=i div 100; b:=(i div 10) mod 10; 或b:=(i mod 100) div 10; c:=i mod 10; if a*a*a+b*b*b+c*c*c=i then writeln(i:8); end; end.

program samp2; var a,b,c:integer; begin for a:=1 to 9 do for b:=0 to 9 do for c:=0 to 9 do if(a*a*a+b*b*b+c*c*c)=(a*100+b*10 +c) then writeln(a*100+b*10+c); readln(); END.

百钱百鸡问题: 一只公鸡值3元,一只母鸡值1元,而1 元可买3只小鸡。现有100元钱,想买100只 鸡。问可买公鸡、母鸡、小鸡各几只

“百钱买百鸡”是我国古代的著名数学题。 题目这样描述:3文钱可以买1只公鸡,2文 钱可以买一只母鸡,1文钱可以买3只小鸡。 用100文钱买100只鸡,那么各有公鸡、母 鸡、小鸡多少只?与之相似,有"鸡兔同笼" 问题。

program samp4; var gj,mj,xj:integer; BEGIN for gj:=1 to 33 do for mj:=1 to 98 do for xj:=1 to 98 do if (gj*3+mj*1+xj/3=100) and(gj+mj

+xj=100) then writeln('gj=',gj,' mj=',mj,' xj=',xj); readln(); END.

一只公鸡值5元,一只母鸡值3元,3只小鸡值1元,现用 一百元要买一百只鸡,问有什么方案?
(答案:(0、25、75),(4、18、78),(8、11、 81),(12、4、84))

program e;
var i,j,k:integer; begin

writeln;
for i:=1 to 20 do for j:=1 to 33 do begin k:=100-i-j; if (k mod 3=0)and(5*i+3*j+(k div 3)=100) then writeln(i:8,j:8,k:8); end; end.

输入一整数A,判断它是否质数。 (提示:若从2到A的平方根的范围内,没有 一个数能整除A,则A是质数。)

Program sushu; Var I,j:integer; P:boolean; Begin For I:=2 to 100 do begin P:=true; For j:=2 to trunc(SQRT(I)) do begin If I mod j=0 then p:=false; End; If p then write(I:5); End; End.

输入一个年份,判断它是否闰年。 我们知道,每四年中有一年是闰年,即有 366天,而其余三年是平年,只有 365天,而按照 规定: 1、如果哪一年的年份能被 4整除,则该 年一般为闰年; 2、这样,每 100年又会少一天, 所以又规定如果该年能被 4整除,又能被 100整 除,则认为该年不是闰年,而是平年; 3、这样, 每 400年又会多出一天,所以又规定,如果哪一 年能被 400整除,则该年又是闰年。

Program q43; Var y:integer; Begin Readln(y); if (y mod 4=0) then begin if (y mod 100=0) then begin if (y mod 400=0) then begin writeln('run'); end else begin writeln('ping'); end; end else begin writeln('run'); end; end else begin writeln('ping'); end; end.

求两个数的最小公倍数和最大公约数。 (提示: 公约数一定小于等于两数中的小数,且能 整除两数中的大数。 公倍数一定大于等于两数中的大数,且是大 数的倍数,又能给两数中的小数整除。)
测试数据16和24,最大公约数8,最小公倍数48

【问题分析】 我们只需从M,N中更小的一个数开始, 每次让其减1,直到这个数能同时被M和N 数整除为止,此时的这个数就是m和n的最 大公约数。

Var m,n,x:integer; Begin Readln(m,n); If m>n then x:=n else x:=m; While (n mod x<>0) or (m mod x<>0) do begin x:=x-1; End; Writeln(x); End.

求两个数的最大公约数还有一个更为快速的 方法——辗转相除法,其算法描述如下: 1)m除以n得到的余数为r(0<=r<n); 2)若r=0则算法结束,n为最大公约数。否则 转3); 3)m=n,n=r,转1); 请用两种循环语句各编写一个程序使用辗 转相除法求两个数的最大公约数

? 输入一个正整数N,把它分解成质因子相乘 的形式。 如:36=1 X 2 X 2 X 3 X 3; 19=1 X 19 (提示:设因子为I,从2开始到N,让N 重复被I除,如果能整除,则用商取代N,I 为一个因子;如果不能整除,再将I增大, 继续以上操作,直到I等于N。)

? 三位回文数就是百位和个位相等的三位数, 请找出

所有的三位回文数并打印

题目: 一个5位数,判断它是不是回文数。即12321是 回文数,个位与万位相同,十位与千位相同。 var a,b1,b2,b3,b4,b5:longint; begin readln(a); b1:=a mod 10;a:=a div 10; b2:=a mod 10;a:=a div 10; b3:=a mod 10;a:=a div 10; b4:=a mod 10;a:=a div 10; b5:=a; if (b1=b5) and (b2=b4) then writeln('yes') else writeln('no'); end.

根据公式 计算圆周率的π值。

?2

1 1 1 ? 1? 2 ? 2 ??? 2 6 2 3 n



测试数据n=10000;答案:3.1414971639

program e; var i:longint; s:real; begin writeln; s:=0; for i:=1 to 10000 do s:=s+1/(i*i); writeln(sqrt(6*s)); end.

利用格利高公式求π。

?

1 1 1 ? 1 ? ? ? ?? 4 3 5 7

直到最后一项的值小于10-6为止
答案: 3.1415946569E+00

program e2_32; var n,fh:longint; s,t,p:real; begin writeln; n:=1; s:=0; t:=1; fh:=1; while (abs(t)>=1e-6) do begin t:=fh/n; s:=s+t; n:=n+2; fh:=-fh; end; p:=4*s; writeln('pi=',p); end.

利用公式 求π

?

1 1 1 ? ? ? ?? 8 1? 3 5 ? 7 9 ?11



计算前10000项时, 答案为3.1415426536

program e; var i,a,b:longint; x,s:real; begin writeln; s:=0; for i:=1 to 10000 do begin a:=(4*i3); b:=(4*i-1); s:=s+1/(a*b); end; writeln(8*s); end.


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