0

私は現在ソフトウェアエンジニアリングとWeb開発に携わっている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! ");
        }


    }
}

...しかし、私はこのプログラムに正しい答えを表示させることができません。どんな助けでも大歓迎です。ありがとう!

4

5 に答える 5

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

于 2013-03-14T16:49:59.083 に答える
0

プログラミングで、連続した数の範囲でテストを繰り返すことに気付いたときはいつでも、間違ったことをしていることになります。このためのより良い構成はループです。これにより、識別子内の数値の範囲がわかり、これを使用して繰り返しコードを1回記述することができます。たとえば、このコードを書き直すことができます

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

少しのグーグルフーまたは一般的な素数についての少しのへそ-あなたは素朴なアルゴリズムにあなたを導きます:

0 <nとなるすべてのnについて:

  • 2つの「特別な場合」の素数、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 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 に答える