在2002年奥林匹克竞赛(NOIP)复赛中有这样一题:已知Sn=1+1/2+1/3+……+1/n。显然对于任意一个整数K,当n足够大时,Sn大于K。现给出一个整数K(1≤K≤15),要求计算出一个最小的n,使得Sn>K。
输入:键盘输入 K
输出:屏幕输出 n
当看到题后,同学们马上就会想到用循环,因为Sn=1+1/2+1/3+……+1/n是一个很典型的累加求和问题,所以也自然就会想到用FOR/NEXT来实现循环(此处用BASIC语言,竞赛时可以使用的语言)。于是有:
Sn=0
FOR I=1 TO N
Sn=Sn+1/N
NEXT I
然后再加上条件判断语句,相信就会求出一个K值。将上面程序逐步完善,如下所示:
10 INPUT K
20 Sn=0
30 FOR I=1 TO N
40 Sn=Sn+1/N
50 IF Sn>K THEN GOTO 70
60 NEXT I
70 PRINT N
80 END
上机测试,为什么结果总是0呢?在40语句后加一行打印语句(45 PRINT S),进行调试,结果全是0,这说明没有执行累加语句,为什么呢?
原来,在没有给N赋初值的情况下,默认值为0,那就难怪上述程序不执行循环体了,可是在题目要求里,N是我们所要求的值,在求出之前,我们并不知道N的值啊。即使给N赋了一个很大的值,让它去执行循环,勉强能解此题的话,这在思路上也是不可取的,而且浪费了资源,降低了程序的执行效率。更何况这个N值应大到什么程度呢?怎么办?
让我们先来分析一下FOR/NEXT语句,格式如下:
FOR I=初值 TO 终值 STEP 步长值
循环体
NEXT I
它是将循环变量的值与终值进行比较,当循环变量的值未超过终值的范围时,则顺序执行循环体内各个语句,若循环变量的值超过终值的范围,则退出循环,执行NEXT的后继语句。也就是说它是利用循环变量的增值来控制程序的循环次数,从而完成循环过程的,所以必须得有一个具体的N值,当然可以是已赋值的变量或算术表达式。
此时我们可以下结论,像这道题这样的循环结构程序,是不能用FOR/NEXT语句来完成的。(你心里一定在想FOR/NEXT都实现不了,那还能有谁能实现啊!当然有了!)用WHILE/WEND语句也能实现循环哦,它是通过一个标志来控制循环的语句,它的格式如下:
WHILE 关系表达式
循环体
WEND
执行过程为首先判断关系表达式,当关系表达式的值为真时,顺序执行循环体内各语句,当遇到WEND时,再次判断表达式的值,决定是否执行循环体,当关系表达式的值为假时,则执行WEND的下一语句。
下面用WHILE/WEND 来实现上述程序:
10 INPUT K
20 Sn=0:N=0
30 WHILE Sn <=K
40 N=N+1
50 Sn=Sn+1/N
60 WEND
70 PRINT N
80 END
上机测试,一路绿灯,顺利通过了。所以大家在用循环语句的时候,一定要注意每种循环语句的特点和适用范围。使用WHILE循环结构,可以事先并不清楚循环的次数,但应知道什么时候结束循环的执行;若事先知道循环次数,则可以使用FOR循环结构。