Asp with C# Prime Number

本文关键字:Number Prime with Asp | 更新日期: 2023-09-27 18:04:00

我是一名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! ");
        }

    }
}

…但是我无法让这个程序显示正确的答案。任何帮助都将非常感激。谢谢!

Asp with C# Prime Number

你把质数的概念理解错了。例如,您的代码将报告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

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;
}

在google上搜索一下,或者对质数进行一些思考,你就会得到一个朴素的算法:

对于所有满足0

  • 有两个"特例"素数,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 ;
}

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

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

试试下面的代码:

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;
    }
}