Asp与C#Prime数字

时间:2013-03-14 16:36:07

标签: c# asp.net numbers

我是一名17岁的学生,目前从事软件工程和网络开发,现在我的一些编码工作遇到了麻烦。我需要制作一个项目,让用户输入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! ");
        }


    }
}

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

5 个答案:

答案 0 :(得分:3)

你有素数概念错了。例如,您的代码会报告3不是素数,因为即使输入的数字是3,您也可以检查数字是否均匀分为3个。

最简单的解决方案是从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

答案 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))

如下

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操作。您正在寻找逻辑和运算符&&

答案 2 :(得分: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;

}

答案 3 :(得分:0)

一般来说,一点点google-fu或者一点点关于素数的肚脐会引导你进入天真的算法:

对于所有n,使得0 <0。 N:

  • 有两个“特殊情况”素数, 1 2
  • 所有偶数&gt;根据定义,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 ;
}

答案 4 :(得分: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;
    }
}