我正在试着写一个程序,如果你输入一个数字并单击一个按钮,程序将能够确定该数字是否为质数(只能被1及其本身整除)。
例如,当我输入数字"5“时,程序会说”是“,这是一个质数。但是,当我输入不是质数的"4“时,程序仍然声明是质数。
考虑到我写的"If“语句和循环,我不确定我哪里出错了。我的代码如下:
Public Class Form1
Private Sub btnCalculate_Click(sender As Object, e As EventArgs) Handles btnCalculate.Click
Dim iNum, iSum As Double
Dim isPrime As Boolean = True
iNum = Convert.ToInt32(tbxN.Text)
For i = 2 To (iNum - 1) Step 1
iSum = iNum Mod i
Next
If iSum = 0 Then
isPrime = False
lblAnswer.Text = "No"
Else
isPrime = True
lblAnswer.Text = "Yes"
End If
End Sub
End Class
我认为这可能是我的" if“语句的问题,程序只使用循环中的最后一个值来决定质数,但是,我需要它,如果iSum为0,那么它就不是质数。如果iSum从不为0,则它是质数。
我该如何着手解决这个问题呢?谢谢!
发布于 2014-01-29 18:15:19
您需要修改您的逻辑,您当前的逻辑正在覆盖iSum
的值,从而导致错误结果。一旦发现iSum
为0
,就应该中断循环,否则布尔变量isPrime
将保持为false。(我还在初始化时将可变isPrime
更改为false )
Private Sub btnCalculate_Click(sender As Object, e As EventArgs) Handles btnCalculate.Click
Dim iNum, iSum As Double
Dim isPrime As Boolean = False
iNum = Convert.ToInt32(tbxN.Text)
For i = 2 To (iNum - 1) Step 1
iSum = iNum Mod i
If (iSum = 0) Then
isPrime = True
Exit For
End If
Next
If isPrime Then
lblAnswer.Text = "Yes"
Else
lblAnswer.Text = "No"
End If
End Sub
此外,您还可以通过检查循环直到iNum / 2
而不是iNum - 1
来进一步优化代码,或者更好的方法(如注释中所指出的)是检查直到该数字的平方根:
For i = 2 To Math.Sqrt(iNum) Step 1
有关它的更多信息,请访问Wikipedia
发布于 2014-01-29 18:15:40
这个检测数字是否为质数的算法是不正确的:
For i = 2 To (iNum - 1) Step 1
iSum = iNum Mod i
Next
If iSum = 0 Then
isPrime = False
...
它假设如果一个数不是质数,它将被范围2..N-1中的所有数整除。对非质数的实际要求是可以被这个范围内的任何数字整除。
要实现这一点,请检查iNum Mod i
是否为零,并在看到它时立即停止循环。当iNum Mod i
为零时,设置一个标示“不是质数”的标志。如果你的循环在没有达到上述条件的情况下完成,那么这个数字是质数。
请注意,您不必检查2..N-1范围内的所有数字:如果您遍历了从2到N
的平方根(包括2)的数字,并且没有找到任何因子,则您知道该数字是质数。
发布于 2014-01-29 18:21:20
你也不需要对任何东西求和,如果你得到stop x == 0,在2的范围内,sqrt(p),这意味着p不是素数,停止循环并返回。
https://stackoverflow.com/questions/21439174
复制相似问题