0

我是一名 17 岁的学生,目前正在学习软件工程和 Web 开发,我现在在编写一些代码时遇到了麻烦。我需要做一个项目,让用户输入一个从 0 到 999 的数字,并判断它是否是质数。我到目前为止的代码是....

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {

    }
    public void primeNumber()

    {

        int primeNumber1 = int.Parse(Request.Form["Text4"]);

        if (primeNumber1 % 1 == 0 &  !           (primeNumber1 % 2 == 0 &
                                                  primeNumber1 % 3 == 0 &
                                                  primeNumber1 % 4 == 0 &
                                                  primeNumber1 % 5 == 0 &
                                                  primeNumber1 % 6 == 0 &
                                                  primeNumber1 % 7 == 0 &
                                                  primeNumber1 % 8 == 0 &
                                                  primeNumber1 % 9 == 0))
                {
            Response.Write(" This is a prime number! ");
        }

        else
        {
            Response.Write(" This is not a prime Number! ");
        }


    }
}

...但我无法让这个程序显示正确的答案。任何帮助将不胜感激。谢谢!

4

5 回答 5

3

你把素数的概念弄错了。例如,您的代码会报告 3 不是质数,因为即使输入的数字是 3,您也会检查该数字是否均分为三。

最简单的解决方案是从 2 到 2 循环primeNumber1 - 1并检查其中是否有任何一个与该数字相等。当您使用循环时,您还需要一个变量来保存结果,因为您没有返回结果的单个表达式。

就像是:

bool prime = true;
for (int i = 2; i <= primeNumber1 - 1; i++) {
  if (primeNumber1 % i == 0) {
    prime = false;
  }
}

对于相当小的数字,这当然是解决问题的最简单的可能解决方案。例如,您可以通过在知道它不是质数后立即退出循环来改进解决方案。

您也不需要一直循环到primeNumber1 - 1,而只需循环到数字的平方根,但如果您阅读检查素数的方法,您可以了解这一点。

您还需要处理 1 和 2 的特殊情况。根据定义,1 不是素数,但 2 是。

http://en.wikipedia.org/wiki/Prime_number

于 2013-03-14T16:49:59.083 回答
0

一般而言,对素数稍加用 google-fu 或对素数稍加注意,将引导您进入朴素算法:

对于所有满足 0 < n 的 n:

  • 有两个“特殊情况”素数,12
  • 根据定义,所有大于 2 的偶数都是非质数
  • 如果您考虑因式分解的性质,您必须考虑的最大可能因素是 的平方根n,因为在该点之上,这些因素是自反的(即 100 的可能因式分解是 1*100 、 2*50 、 4 *25 , 5*20 , 10*10 , 20*5 , 25*4, 50*2 和 100*1 — 100 的平方根是...10)。

这应该会引导您实现一个看起来像这样的实现:

static bool IsPrime( int n )
{
  if ( n < 1 ) throw new ArgumentOutOfRangeException("n") ;

  bool isPrime = true ;
  if ( n > 2 )
  {

    isPrime = ( 0 != n & 0x00000001 ) ; // eliminate all even numbers

    if ( isPrime )
    {
      int limit = (int) Math.Sqrt(n) ;
      for ( int i = 3 ; i <= limit && isPrime ; i += 2 )
      {
        isPrime = ( 0 != n % i ) ;
      }
    }
  }
  return isPrime ;
}
于 2013-03-14T18:07:24.173 回答
0
bool IsPrime(int number) {

    if (number == 1) return false;
    if (number == 2) return true;

    for (int i = 2; i < number; ++i)  {
       if (number % i == 0)  return false;
    }

    return true;

}
于 2013-03-14T16:55:49.170 回答
0

每当您发现自己在编程中重复对一系列数字进行测试时,您就做错了。一个更好的构造是循环。这将为您提供标识符中的数字范围,然后可用于编写重复代码一次。例如我可以重写这段代码

primeNumber1 % 2 == 0 &
primeNumber1 % 3 == 0 &
primeNumber1 % 4 == 0 &
primeNumber1 % 5 == 0 &
primeNumber1 % 6 == 0 &
primeNumber1 % 7 == 0 &
primeNumber1 % 8 == 0 &
primeNumber1 % 9 == 0))

如下

bool anyFactors = false;
for (int i = 2; i <= 9; i++) {
  if (primeNumber1 % i != 0) { 
    anyFactors = true;
    break; 
  }
}

在这一点上,我现在可以将值替换allTrue为您编写的原始条件。

if (primeNumber1 % 1 == 0 && !anyFactors)

我还可以通过用不同的数字代替循环的条件检查来扩展此处测试的值的数量。如果我想检查 999 个值,我会改为写

for (int i = 2; i <= 999; i++) { 
  ...
}

此外,您不想&在这种情况下使用。那是用于位级and操作。您正在寻找逻辑和运算符&&

于 2013-03-14T16:45:06.107 回答
0

试试下面的代码:

bool isPrimeNubmer(int n)
{
    if (n >=0 && n < 4) //1, 2, 3 are prime numbers
        return true;
    else if (n % 2 == 0) //even numbers are not prime numbers
        return false;
    else
    {
        int j = 3;
        int k = (n + 1) / 2 ;

        while (j <= k)
        {
            if (n % j == 0)
                return false;
            j = j + 2;
        }
        return true;
    }
}
于 2015-05-21T18:48:54.807 回答