第讲循环结构while
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
3、能 用for的一定能用while实现。
例1、键入一个自然数N(<=106),求这个自然数 的因数的个数S(包含1和n)。 如: 输入:
6 输出:
4
var n,I,s:longint;
begin readln(n); s:=0; for i:=1 to n do if n mod i=0 then s:=s+1; writeln(s);
end;
其意义为: 当布尔表达式的值为true时,执行do后面的语句。
例1: 求两个数a,b(<1000)的最小公倍数。 样例: 输入: 20 30 21输出: 2260
var a,b:integer; s:longint;
begin readln(a,b); s:=a; while s mod b<>0 do s:=s+a; writeln(s);
【输入】 第1行只包括一个100到120之间(包含100和120)的整数 (以厘米为单位),表示陶陶把手伸直的时候能够达到的最 大高度。 第2行包含10个100到200之间(包括100和200)的整数 (以厘米为单位)分别表示10个苹果到地面的高度,两个相 邻的整数之间用一个空格隔开。 【输出】 输出包括一行,这一行只包含一个整数,表示陶陶能够摘到 的苹果的数目。 【样例输入】
有多少盏灯关闭? n,m,i:integer;
begin readln(n); for i:=1 to n do begin m:=trunc(sqrt(i)); if m*m=i then write(0) else write(1); end;
end.
3、已知方程: sin( x ) x 10
end.
var n,i,s:longint;
begin readln(n); s:=0; i:=1; while i<=n do begin if n mod i=0 then s:=s+1; i:=i+1; end; writeln(s);
end.
例2:求s=3+6+9+……+300的值。
var i,s:integer;
引例:
求恰好使s=1+1/2+1/3+…+1/n的值大于10时n的值。
var s : real; n : integer;{n分母}
begin s:=0; n:=0; while s<=10 do{当s的值还未超过10时} begin n:=n+1;{分母1} s:=s+1/n;{将下一项值累加到s} end; writeln(n);{输出结果}
110
100 200 150 140 129 134 167 198 200 111 【样例输出】
5
var h,x,sum,i:integer;
begin sum:=0; readln(h); h:=h+30; for i:=1 to 10 do begin read(x); if x<=h then inc(sum); end; writeln(sum);
end.
while循环
当循环次数不能预先确定时,只能根据某一条件来决定是
否进行循环时,用while 语句实现。
格式:
循环体中必须有改变循环控
while <布尔表达式> do 制<一变量条的语语句句:,循否环则体出>现;死
或: while <布尔表达式> do 循环。区别于for结构
begin
<语句组:循环体>
end.
2、灯的开关状态
有N个灯放成一排,从1到N依次顺序编号,开始时全部打开。 有N个人也从1到N依次编号。1号人将灯全部关闭,2号人将 凡是编号为2的倍数的灯打开;3号人将凡是编号为3的倍数的 灯作相反处理(该灯如为打开的, 则将它关闭;如关闭的,则 将它打开)。以后的人都和3号人一样,将凡是自己编号倍数的 灯作相反处理。 编程实现:第N个人操作后,按顺序输出灯的状态。(1-表示灯 打开,0-表示灯关闭) 输入:n(n<=100),灯的个数, 输出:灯的状态,01序列,中间无空格。 样例: 输入:2 输出:01
1、陶陶摘苹果(NOIP2006p)
(apple.pas/c/cpp) 【问题描述】
陶陶家的院子里有一棵苹果树,每到秋天树上就会结 出10个苹果。苹果成熟的时候,陶陶就会跑去摘苹果。陶 陶有个30厘米高的板凳,当她不能直接用手摘到苹果的时 候,就会踩到板凳上再试试。
现在已知10个苹果到地面的高度,以及陶陶把手伸 直的时候能够达到的最大高度,请帮陶陶算一下她能够摘 到的苹果的数目。假设她碰到苹果,苹果就会掉下来。
算法分析:
初始状态:1111111111……1 先分析:编号为4、5、8、15、25、32、36……灯最后的状态
结论:编号为i的灯经过偶数次操作为1,奇数次操作为0.
编号i的灯的操作次数等于因数个数,只有完全平方数的因数 个数为奇数.所以判断第i个灯的状态:如果i是完全平方数则状 态为0,否则为1. var
end.
最大公约数?
例2、输入n(<1015),求他的各位数字之和. 如: 输入: 1234 输出: 10
var n:int64; s,t:integer;
begin read来自百度文库n(n); s:=0; while n<>0 do begin t:=n mod 10; s:=s+t; n:=n div 10; end; writeln(s);
begin s:=0; for i:=1 to 100 do s:=s+3*i; writeln(s);
end.
var i,s:integer;
begin s:=0; i:=0; while i<=300 do begin s:=s+i; i:=i+3; end; writeln(s);
end.
二、循环结构的综合练习
end.
Int64 :[-9*1018 , 9*1018]
[ -92233728, 92233727]
For 与 while 的区别与联系:
1、for 必须能预先确定循环次数。 循环控制变量,每次自动加1,不能人为的改变。
2、while 可以不知道循环次数。 在循环体内必须有修改循环控制变量的语句,否则死循环。 循环控制变量的改变可以不是1。但必须是整数。
例1、键入一个自然数N(<=106),求这个自然数 的因数的个数S(包含1和n)。 如: 输入:
6 输出:
4
var n,I,s:longint;
begin readln(n); s:=0; for i:=1 to n do if n mod i=0 then s:=s+1; writeln(s);
end;
其意义为: 当布尔表达式的值为true时,执行do后面的语句。
例1: 求两个数a,b(<1000)的最小公倍数。 样例: 输入: 20 30 21输出: 2260
var a,b:integer; s:longint;
begin readln(a,b); s:=a; while s mod b<>0 do s:=s+a; writeln(s);
【输入】 第1行只包括一个100到120之间(包含100和120)的整数 (以厘米为单位),表示陶陶把手伸直的时候能够达到的最 大高度。 第2行包含10个100到200之间(包括100和200)的整数 (以厘米为单位)分别表示10个苹果到地面的高度,两个相 邻的整数之间用一个空格隔开。 【输出】 输出包括一行,这一行只包含一个整数,表示陶陶能够摘到 的苹果的数目。 【样例输入】
有多少盏灯关闭? n,m,i:integer;
begin readln(n); for i:=1 to n do begin m:=trunc(sqrt(i)); if m*m=i then write(0) else write(1); end;
end.
3、已知方程: sin( x ) x 10
end.
var n,i,s:longint;
begin readln(n); s:=0; i:=1; while i<=n do begin if n mod i=0 then s:=s+1; i:=i+1; end; writeln(s);
end.
例2:求s=3+6+9+……+300的值。
var i,s:integer;
引例:
求恰好使s=1+1/2+1/3+…+1/n的值大于10时n的值。
var s : real; n : integer;{n分母}
begin s:=0; n:=0; while s<=10 do{当s的值还未超过10时} begin n:=n+1;{分母1} s:=s+1/n;{将下一项值累加到s} end; writeln(n);{输出结果}
110
100 200 150 140 129 134 167 198 200 111 【样例输出】
5
var h,x,sum,i:integer;
begin sum:=0; readln(h); h:=h+30; for i:=1 to 10 do begin read(x); if x<=h then inc(sum); end; writeln(sum);
end.
while循环
当循环次数不能预先确定时,只能根据某一条件来决定是
否进行循环时,用while 语句实现。
格式:
循环体中必须有改变循环控
while <布尔表达式> do 制<一变量条的语语句句:,循否环则体出>现;死
或: while <布尔表达式> do 循环。区别于for结构
begin
<语句组:循环体>
end.
2、灯的开关状态
有N个灯放成一排,从1到N依次顺序编号,开始时全部打开。 有N个人也从1到N依次编号。1号人将灯全部关闭,2号人将 凡是编号为2的倍数的灯打开;3号人将凡是编号为3的倍数的 灯作相反处理(该灯如为打开的, 则将它关闭;如关闭的,则 将它打开)。以后的人都和3号人一样,将凡是自己编号倍数的 灯作相反处理。 编程实现:第N个人操作后,按顺序输出灯的状态。(1-表示灯 打开,0-表示灯关闭) 输入:n(n<=100),灯的个数, 输出:灯的状态,01序列,中间无空格。 样例: 输入:2 输出:01
1、陶陶摘苹果(NOIP2006p)
(apple.pas/c/cpp) 【问题描述】
陶陶家的院子里有一棵苹果树,每到秋天树上就会结 出10个苹果。苹果成熟的时候,陶陶就会跑去摘苹果。陶 陶有个30厘米高的板凳,当她不能直接用手摘到苹果的时 候,就会踩到板凳上再试试。
现在已知10个苹果到地面的高度,以及陶陶把手伸 直的时候能够达到的最大高度,请帮陶陶算一下她能够摘 到的苹果的数目。假设她碰到苹果,苹果就会掉下来。
算法分析:
初始状态:1111111111……1 先分析:编号为4、5、8、15、25、32、36……灯最后的状态
结论:编号为i的灯经过偶数次操作为1,奇数次操作为0.
编号i的灯的操作次数等于因数个数,只有完全平方数的因数 个数为奇数.所以判断第i个灯的状态:如果i是完全平方数则状 态为0,否则为1. var
end.
最大公约数?
例2、输入n(<1015),求他的各位数字之和. 如: 输入: 1234 输出: 10
var n:int64; s,t:integer;
begin read来自百度文库n(n); s:=0; while n<>0 do begin t:=n mod 10; s:=s+t; n:=n div 10; end; writeln(s);
begin s:=0; for i:=1 to 100 do s:=s+3*i; writeln(s);
end.
var i,s:integer;
begin s:=0; i:=0; while i<=300 do begin s:=s+i; i:=i+3; end; writeln(s);
end.
二、循环结构的综合练习
end.
Int64 :[-9*1018 , 9*1018]
[ -92233728, 92233727]
For 与 while 的区别与联系:
1、for 必须能预先确定循环次数。 循环控制变量,每次自动加1,不能人为的改变。
2、while 可以不知道循环次数。 在循环体内必须有修改循环控制变量的语句,否则死循环。 循环控制变量的改变可以不是1。但必须是整数。