i信息学奥赛

加入QQ群:1025629106,或关注微信公众号:i信息学奥赛,获取更多学习资源。

导航

while语句

Posted on 2016-12-13 13:03  shnoip  阅读(580)  评论(0编辑  收藏  举报
一、while语句的格式
使用for语句编写程序时一般需要事先知道循环次数,如果遇到不能确定循环次数的问题时可以使用while语句。while语句用于“当满足某一条件时进行循环”的情况
 
while语句的格式:while 布尔表达式 do 语句;
while语句的执行过程是:先求布尔表达式的值,当其值是真时,进入循环执行do后面的语句;然后返回再求布尔表达式的值,若布尔表达式的值是真,再次执行do后面的语句;如果布尔表达式的值是假就退出循环,执行while下面的语句。
 
注意事项:
1、为了使while循环正常终止,在循环体内一定要有改变布尔表达式值的语句,以使布尔值有可能为假,从而结束循环;否则将会导致循环无法结束的“死循环”状态
2、循环体是多个语句时,需用begin和end将它们括起来形成一条复合语句。
3、如果循环开始时,布尔表达式就为假,则不执行循环体,直接退出while语句。
 
例1:有一张纸,其厚度为0.1毫米,将它对折多少次,其厚度将超过珠穆朗玛峰的高度。
var
  i:byte;
  r:real;
begin
  i:=0;
  r:=0.0001;
  while r<8848 do begin
    r:=r*2;
    i:=i+1;
  end;
  writeln(i);
end.
 
例2:输入一个正整数,求这个正整数的各位数字之和。
var
  n,ans:integer;
begin
  readln(n);
  ans:=0;
  while n>0 do begin
    ans:=ans+n mod 10;
    n:=n div 10;
  end;
  writeln(ans);
end.
 
例3:输入一个正整数,将这个正整数的各位数字逆序输出。
var
  n:integer;
begin
  readln(n);
  while n>0 do begin
    write(n mod 10);
    n:=n div 10;
  end;
end.
 
思考:如何优化,使得输入120,输出21。
 
例4:输入两个正整数,求这两个正整数的最大公约数。
分析:采用辗转相除法求m和n的最大公约数,即:设m=n+r(0<=r<n),则m和n的最大公约数与n和r的最大公约数相同,当r等于0,这时的n就是m和n的最大公约数。若r不等于0,再对n和r重复上面过程,直到r=0为止。
例如:求231和63的最大公约数
231 mod 63=42
63 mod 42=21
42 mod 21=0
所以42和21的最大公约数为21,由此得出231和63的最大公约数也为21。
 
var
  a,b,c:integer;
begin
  readln(a,b);
  while b>0 do begin
    c:=a mod b;
    a:=b;
    b:=c;
  end;
  writeln(a);
end.
 
思考:你会求两个数的最小公倍数吗?
 
例5:输入一个大于1的自然数N,将N分解成质因数的乘积。
例如:
N=120
120=2*2*2*3*5
 
var
  n,i:integer;
  f:boolean;
begin
  readln(n);
  write(n,'=');
  f:=false;
  i:=2;
  while n>=i do begin
    while n mod i=0 do begin
      if f then write('*') else f:=true;
      write(i);
      n:=n div i;
    end;
    i:=i+1;
  end;
end.
 
例6:求2到1000之间的素数,一行打印十个素数。
var
  i,k:integer;
  prime:boolean;
begin
  for i:=2 to 1000 do begin
    prime:=true;
    k:=2;
    while (k<=trunc(sqrt(i))) and prime do begin
      if i mod k=0 then prime:=false;
      k:=k+1;
    end;
    if prime then write(i:8);
  end;
end.
 
二、作业
1、zerojudge:
基础题:a024、a038、a121、a147、a149、a738、d070、d356、d693、d899
思考题:a215、a307、b330、c079、d255、d593
 
2、利用公式π/4=1-1/3+1/5-1/7+……,求π的值,要求精确到最后一项小于0.0001为止。
3、打印输出一百到一亿之间的,既是完全平方数又是回文数的所有正整数(完全平方数是一个正整数的平方数,回文数即为左右对称的正整数)。例如:121,它是11的平方,也是左右对称的自然数。
4、输入两个正整数,求这两个正整数的最小公倍数。(设这两个数分别是m和n,另设一个整型变量i,则m*i就是m的i倍。令i向n变化,每次增加1,在此过程中,当m*i能被n整除时,m*i即为所求。)