-1
put "enter a number to determine if it is or is not prime"
get primenum
% for i : 1 .. primenum by 1
% end for
if (primenum / primenum) = 1 or primenum / 1 = 0 then
    put primenum, " is a prime number"
else
    put primenum, " is not a prime number"
end if

输出说 12 是一个素数,我们知道那是错误的,所以......
我的代码有什么问题,我该如何解决?

4

3 回答 3

6

嗯,我不懂那种语言,但它看起来很容易阅读。你的第一个问题是这一行:

if (primenum / primenum) = 1 or primenum / 1 = 0 then

这是测试primenum除以primenum是一还是primenum除以一是零。第一个条件将始终为真,因此您的算法将报告每个整数都是质数。

让我们回顾一下素数的定义。如果一个自然数n恰好有两个不同的自然数除数,那么它就是素数。这意味着要检查并查看是否为素数,您必须验证除了和本身n没有其他除数(请注意,隐式不能等于,否则它的唯一除数是并且不不同)。要做到这一点,只需考虑所有可能的数字,这些数字可能是 exclude 和本身的除数,并检查其中是否有除数。这意味着我们只是循环检查这些数字中的任何一个是否均分。范围内的自然数n1nn111n1nn2n - 1n2n - 1是唯一可能无效n的素数。

因此,实现一个数字是否为素数的测试的最天真的方法如下。接受一个数字作为输入n。然后,检查是否n小于2。如果是,则不能是素数。2然后,从到循环n - 1;调用循环变量k。检查是否有k任何2均分n - 1( n) if n mod k = 0。如果有这样的k,那么n不能是素数,你可以从循环中中断。否则,如果循环终止而没有中断,n则为素数。所以,在伪代码中

integer n
get n
boolean flag
if n < 2
    flag = false
else
    flag = true
    for k = 2 to n - 1
        if n mod k = 0 
            flag = false
            break
if flag
    print "prime"
else
    print "not prime"

现在,只需对您的代码进行一点评论。不要命名输入primenum。您的代码的读者可能会认为这primenum实际上是一个质数,因为您如此命名它。像这样的名字valueToTest在这里会被强烈推荐。

于 2010-01-26T21:16:43.807 回答
1

你的代码......没有多大意义。

% for i : 1 .. primenum by 1
% end for

喔。空循环。除了烧掉时钟周期之外什么都不做。

if (primenum mod primenum) = 0

永远都是true

此外,您的病情也出现了错误。如果它可以某物整除(除了它自己和 1),那么它不是素数。

解决方案?可能用伪代码重写它,然后把它变成真正的代码,而不是在完全不理解的情况下尝试破解某些东西。

于 2010-01-26T21:14:04.117 回答
0

素数的定义属性不是它可以1 和它自己整除(所有数字都具有这些属性),而是它不能被其他任何东西整除。

尝试从那里工作。

于 2010-02-06T20:28:46.063 回答