我正在编写一个程序,可以判断给定的数字是否是素数。无论我输入素数还是其他数字,总是显示“这不是素数”。难道这里面有什么毛病吗?
10 input "what is the number";a
20 let b=1
30 let b=b+1
40 let k=a/b
50 let p=fix(k)
60 if p=k then goto 100
70 if b<a then goto 30
80 print "it is a prime number"
90 goto 110
100 print "it is not a prime number"
110 end
run
遵循逻辑:
a
。b
创建为 1
。1
添加到 b
,这样 b
现在就是 2
。k
设置为 a/b
。这意味着 k
现在是 a
的一半。p
设置为 k
,而没有可能存在或不存在的 0.5。p
(a
的一半向下舍入)等于 k
(a
的一半不向下舍入),也就是说,如果 a
能被 b
整除,则它变为 100,并且说it is not a prime number
。b
(即 2
)小于 a
,程序将转到第 30 行,并将另一个 1
添加到 b
并重复该过程,但现在 b
是 3
.b
(即 2
)等于 a
或大于它,则打印出这是一个素数。假设您输入的数字是 2。事实上,二是质数。然而,按照上面的逻辑,你会看到程序会告诉我们它不是素数,因为在第6步,二除以二是一,截断一仍然是一。对于除 1 之外的任何数字都应该如此,因为所有数字都可以被自己整除。
我的猜测是,在您的测试中,您从未测试过 1;程序应该说 1 是一个质数(这是因为即使 1 可以被它自己整除,但你还是从 b=2 开始)。
(另请注意,这在技术上也是错误的:1 不是素数。)
此代码描述了如何确定素数:
10 INPUT p
20 FOR l = 2 TO INT(SQR(p))
30 LET a = p / l
40 LET b = FIX(a)
50 IF a = b THEN GOTO 80
60 NEXT l
70 PRINT "prime"
80 END
关键字
LET
在 GW-BASIC 中是可选的(即使在原始的 Dartmouth BASIC 中)。
GW-BASIC 有一个模运算符 (
MOD
),因此测试 A
是否能被 B
整除可以用 IF A MOD B=0 THEN …
表达得更简洁。
通过增加
B
、测试 B
并跳转到以 GOTO
开头的循环来表示的循环,如果将其表示为实际的 FOR
循环,将更容易阅读。
所以原程序可以这样表达:
10 INPUT "What is the number";A
20 FOR B=2 TO A
30 IF A MOD B=0 THEN PRINT "It is not a prime number.":END
40 NEXT
50 PRINT "It is a prime number."
这会检查
A
在最后一次迭代中是否可被自身整除,这始终为真。 所以我们需要将迭代的上限限制为A-1
。
另一个问题是数字 <2 for which the loop isn't run at all and are therefore identified as prime numbers. A simple hack to fix this would be testing for this and setting
A
到已知的非质数 >2。
10 INPUT "What is the number";A
20 IF A<2 THEN A=4:REM So that numbers <2 are reported as non-prime.
30 FOR B=2 TO A-1
40 IF A MOD B=0 THEN PRINT "It is not a prime number.":END
50 NEXT
60 PRINT "It is a prime number."