主题:[讨论]浅议for...next的用法(QB的越界4)
for i=a to b step c
...
next
相信每个人都会懂得如何去使用这个语句.
意思就是变量 i 的值从 a 到 b 步长为 c 的循环.
步长 c 是可以省略的,默认为1
说的是大家不一定能注意到的东西:
1. a ,b ,c 的值是在第一次执行到 for 的时候就计算好了,
你在之后改变这三个值对 for 的执行范围不会有改变.
也就是 for 已经把这三个值复制到自己的口袋里去了.
你不能改变别人口袋里的数值.
2. 你可以在循环体里改变 i 的值(作用很大)
3. i 的越界
(1) i 的值在第一次执行到 for 的时候赋值为起始值 a
(2) 马上检查 c 的方向,按方向看有没有越过范围 b
(3) 如果没有越界,就执行循环体
(4) 运行到 next 后再回到 for 首
(5) 加上增量 c ,再检查是否越界 b
(6) 如果越界,跳过 next
可以看到,退出 for 循环体的时候 i 的值已经超出有效范围了,
这有什么用呢?
有用!
大家在求质数的时候,或者检查一个数是否在已有队列中的时候都能用到的.
function ZS%(x%)
if x%<2 then exit function
b%=sqr(x%)
for i%=2 to b%
if x% mod i% =0 then exit for
next
if i%>b% then ZS%=1
end function
在循环体里改变 i 的值也会经常用到的,
比如说这段时间里经常有人提一些问题
求一个数的平方(或立方)得数的尾部包含这个数.
还有什么水仙花数.
平方(或立方)后尾数依然的只有 0,1,5,6 这四个数.
当然,4,9可以满足立方的条件的.
先说平方:
deflng a-z
for i=1 to 100
ii=i mod 10
if ii=2 or ii=7 then i=i+3
if (i*i) mod (10^(1+int(log(i)/log(10))))=i then print i,i*i
next
立方的:
deflng a-z
for i=1 to 100
ii=i mod 10
if ii=2 or ii=7 then i=i+2
if (i*i*i) mod (10^(1+int(log(i)/log(10))))=i then print i,i*i*i
next
在这里的计算还不算太繁复,
节约的时间效率还不明显,
当后面的计算过程过多的时候就显得必要了.
上面的例子是跳过某个区间,就是改大了 i 的值.
还可以重复前面的某个区间.就是把 i 值改小,不用我多说了吧.
...
next
相信每个人都会懂得如何去使用这个语句.
意思就是变量 i 的值从 a 到 b 步长为 c 的循环.
步长 c 是可以省略的,默认为1
说的是大家不一定能注意到的东西:
1. a ,b ,c 的值是在第一次执行到 for 的时候就计算好了,
你在之后改变这三个值对 for 的执行范围不会有改变.
也就是 for 已经把这三个值复制到自己的口袋里去了.
你不能改变别人口袋里的数值.
2. 你可以在循环体里改变 i 的值(作用很大)
3. i 的越界
(1) i 的值在第一次执行到 for 的时候赋值为起始值 a
(2) 马上检查 c 的方向,按方向看有没有越过范围 b
(3) 如果没有越界,就执行循环体
(4) 运行到 next 后再回到 for 首
(5) 加上增量 c ,再检查是否越界 b
(6) 如果越界,跳过 next
可以看到,退出 for 循环体的时候 i 的值已经超出有效范围了,
这有什么用呢?
有用!
大家在求质数的时候,或者检查一个数是否在已有队列中的时候都能用到的.
function ZS%(x%)
if x%<2 then exit function
b%=sqr(x%)
for i%=2 to b%
if x% mod i% =0 then exit for
next
if i%>b% then ZS%=1
end function
在循环体里改变 i 的值也会经常用到的,
比如说这段时间里经常有人提一些问题
求一个数的平方(或立方)得数的尾部包含这个数.
还有什么水仙花数.
平方(或立方)后尾数依然的只有 0,1,5,6 这四个数.
当然,4,9可以满足立方的条件的.
先说平方:
deflng a-z
for i=1 to 100
ii=i mod 10
if ii=2 or ii=7 then i=i+3
if (i*i) mod (10^(1+int(log(i)/log(10))))=i then print i,i*i
next
立方的:
deflng a-z
for i=1 to 100
ii=i mod 10
if ii=2 or ii=7 then i=i+2
if (i*i*i) mod (10^(1+int(log(i)/log(10))))=i then print i,i*i*i
next
在这里的计算还不算太繁复,
节约的时间效率还不明显,
当后面的计算过程过多的时候就显得必要了.
上面的例子是跳过某个区间,就是改大了 i 的值.
还可以重复前面的某个区间.就是把 i 值改小,不用我多说了吧.