首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >素数程序.NET的困难

素数程序.NET的困难
EN

Stack Overflow用户
提问于 2014-01-30 02:10:45
回答 5查看 1.4K关注 0票数 0

我正在试着写一个程序,如果你输入一个数字并单击一个按钮,程序将能够确定该数字是否为质数(只能被1及其本身整除)。

例如,当我输入数字"5“时,程序会说”是“,这是一个质数。但是,当我输入不是质数的"4“时,程序仍然声明是质数。

考虑到我写的"If“语句和循环,我不确定我哪里出错了。我的代码如下:

代码语言:javascript
运行
复制
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,则它是质数。

我该如何着手解决这个问题呢?谢谢!

EN

回答 5

Stack Overflow用户

发布于 2014-01-30 02:15:19

您需要修改您的逻辑,您当前的逻辑正在覆盖iSum的值,从而导致错误结果。一旦发现iSum0,就应该中断循环,否则布尔变量isPrime将保持为false。(我还在初始化时将可变isPrime更改为false )

代码语言:javascript
运行
复制
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来进一步优化代码,或者更好的方法(如注释中所指出的)是检查直到该数字的平方根:

代码语言:javascript
运行
复制
For i = 2 To Math.Sqrt(iNum) Step 1

有关它的更多信息,请访问Wikipedia

票数 3
EN

Stack Overflow用户

发布于 2014-01-30 02:15:40

这个检测数字是否为质数的算法是不正确的:

代码语言:javascript
运行
复制
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)的数字,并且没有找到任何因子,则您知道该数字是质数。

票数 1
EN

Stack Overflow用户

发布于 2014-01-30 02:21:20

你也不需要对任何东西求和,如果你得到stop x == 0,在2的范围内,sqrt(p),这意味着p不是素数,停止循环并返回。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21439174

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档