GW BASIC 中以下程序有什么错误?

问题描述 投票:0回答:3

我正在编写一个程序,可以判断给定的数字是否是素数。无论我输入素数还是其他数字,总是显示“这不是素数”。难道这里面有什么毛病吗?

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
basic gw-basic
3个回答
4
投票

遵循逻辑:

  1. 您输入一个数字,
    a
  2. 程序将
    b
    创建为
    1
  3. 程序立即将
    1
    添加到
    b
    ,这样
    b
    现在就是
    2
  4. 程序将
    k
    设置为
    a/b
    。这意味着
    k
    现在是
    a
    的一半。
  5. 程序将
    p
    设置为
    k
    ,而没有可能存在或不存在的 0.5。
  6. 如果
    p
    a
    的一半向下舍入)等于
    k
    a
    的一半不向下舍入),也就是说,如果
    a
    能被
    b
    整除,则它变为 100,并且说
    it is not a prime number
  7. 否则,如果
    b
    (即
    2
    )小于
    a
    ,程序将转到第 30 行,并将另一个
    1
    添加到
    b
    并重复该过程,但现在
    b
    3
    .
  8. 否则,如果
    b
    (即
    2
    )等于
    a
    或大于它,则打印出这是一个素数。

假设您输入的数字是 2。事实上,二是质数。然而,按照上面的逻辑,你会看到程序会告诉我们它不是素数,因为在第6步,二除以二是一,截断一仍然是一。对于除 1 之外的任何数字都应该如此,因为所有数字都可以被自己整除。

我的猜测是,在您的测试中,您从未测试过 1;程序应该说 1 是一个质数(这是因为即使 1 可以被它自己整除,但你还是从 b=2 开始)。

(另请注意,这在技术上也是错误的:1 不是素数。)


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

0
投票

关键字

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."
© www.soinside.com 2019 - 2024. All rights reserved.