0

タスクに問題があります。数が素数であるかどうかを見つけてユーザーに警告する必要があります。

これが私のコードです:

int a = Convert.ToInt32(number);

if (a % 2 !=0 )
{
    for (int i = 2; i <= a; i++)
    {
        if (a % i == 0)
        {
            Console.WriteLine("not prime");
        }
        else
        {
            Console.WriteLine("prime");
        }
        Console.WriteLine();
    }
}
else
{
    Console.WriteLine("not prime");
}
Console.ReadLine();

どこで問題が発生しましたか。どうすれば修正できますか?

4

7 に答える 7

2

素数は 1 で割り切れます。数値が 1 から数値まで正確に 2 つの除数を持っているかどうかを確認する必要があります。

 int devisors = 0;
 for (int i = 1; i <= a; i++)
     if (a % i == 0)                        
          devisors++;

 if (devisors == 2)                 
     Console.WriteLine("prime");
 else
     Console.WriteLine("not prime");

すべての整数が 1 で割り切れることがわかっているため、反復を 1 回スキップできます。素数の約数はちょうど 1 になります。1 には約数が 1 つしかないため、素数ではないためスキップする必要があります。したがって、条件は1以外の約数を1つだけ持つ数値であり、1は素数ではないため、数値は1であってはなりません。

 int devisors = 0;
 for (int i = 2; i <= a; i++)
     if (a % i == 0)                        
          devisors++;

 if (a != 1 && devisors == 1)                 
     Console.WriteLine("prime");
 else
     Console.WriteLine("not prime");
于 2013-01-01T11:48:30.090 に答える
1

プライムかプライムではないかを印刷し、停止するのではなく、ループを続行しました。チェックは特に%2必要ありません。適切に変更:

int a = Convert.ToInt32(number);

bool prime = true;
if (i == 1) prime = false;
for (int i = 2; prime && i < a; i++)
    if (a % i == 0) prime = false;
if (prime) Console.WriteLine("prime");
else Console.WriteLine("not prime");
Console.ReadLine();
于 2013-01-01T12:05:04.187 に答える
0

プライムチェックをやりすぎました。

これは私がしました:

bool isPrime = true;
        List<ulong> primes = new List<ulong>();
        ulong nCheck, nCounted;
        nCounted = 0;
        nCheck = 3;
        primes.Add(2);
        for (; ; )
        {
            isPrime = true;
            foreach (ulong nModulo in primes)
            {
                if (((nCheck / 2) + 1) <= nModulo)
                { break; }
                if (nCheck % nModulo == 0)
                { isPrime = false; }
            }
            if (isPrime == true)
            {
                Console.WriteLine("New prime found: " + (nCheck) + ", prime number " + (++nCounted) + ".");
                primes.Add(nCheck);
            }
            nCheck++;
            nCheck++;
        }

これは正確にはあなたが探しているものではないので、私がすることはこれをバックグラウンドワーカーに置くことですが、同時リストとしてulongsのリスト、または2つのスレッドでアクセスできるものを使用します。または、アクセス中にリストをロックするだけです。プライムhsssがまだ解決されていない場合は、解決されるまで待ちます。

于 2013-01-01T15:38:59.970 に答える
0

おそらくあなたのコードは、ごちゃごちゃしていて無意味に見える大量のメッセージを出力しているのではないでしょうか? 重要な問題は 3 つあります。

  • 素数にできないと判断した場合、for ループから抜け出すことはできません。

  • 素数ではない場合でも素数であると想定しています。以下のコードのコメントを参照してください。

  • a 自体と比較していて、それは常に a で割り切れます。for 条件の <= は < である必要があります。

コード:

int a = Convert.ToInt32(number);

if (a % 2 != 0)
{
    for (int i = 3 i < a; i += 2) // we can skip all the even numbers (minor optimization)
    {
        if (a % i == 0)
        {
            Console.WriteLine("not prime");
            goto escape; // we want to break out of this loop
        }
        // we know it isn't divisible by i or any primes smaller than i, but that doesn't mean it isn't divisible by something else bigger than i, so keep looping 
    }
    // checked ALL numbers, must be Prime
    Console.WriteLine("prime");
}
else
{
    Console.WriteLine("not prime");
}
escape:
Console.ReadLine();

他の人が述べたように、平方根を評価して次の行を置き換えることにより、a の平方根にループすることしかできません。

for (int i = 3 i < a; i += 2)

これとともに:

float sqrRoot = (Int)Math.Sqrt((float)a);
for (int i = 3 i <= sqrRoot; i += 2)

各反復には平方根演算が含まれるため、評価を行うことが重要です。

gotoステートメントが気に入らない場合(私はgotoステートメントが大好きです)、コメントを投稿してください。ブレークアウトブール値に置き換えます(または、Dukelingの最近の回答を参照してください)。

于 2013-01-01T12:00:27.880 に答える
0
public bool isPrime(int num)
{
    for (int i = 2; i < num; i++)
        if (num % i == 0) 
            return false;                       
    return num == 1 ? false : true;
}
于 2013-01-01T12:00:38.880 に答える
0

さらに別の最適化された方法は、エラトステネスのふるいアルゴリズムを使用することです。

ウィキペディアより

エラトステネスの方法で与えられた整数 n 以下のすべての素数を見つけるには:
1. 2 から n までの連続する整数のリストを作成します: (2, 3, 4, ..., n)。
2. 最初に、p を最初の素数である 2 とします。
3. p から始めて、p の増分でカウントアップし、リスト内の p 自体よりも大きいこれらの数字のそれぞれにマークを付けます。これらは p の倍数になります: 2p、3p、4p など。それらのいくつかはすでにマークされている可能性があることに注意してください。
4. マークされていないリストで、p より大きい最初の数字を見つけます。そのような数がなかった場合は、停止します。それ以外の場合は、p をこの数 (次の素数) に等しくし、手順 3 から繰り返します。

When the algorithm terminates, all the numbers in the list that are not marked are prime.

C# コード

  int[] GetPrimes(int number) // input should be greater than 1
    {
        bool[] arr = new bool[number + 1];
        var listPrimes = new List<int>();

        for (int i = 2; i <= Math.Sqrt(number); i++)
        {
            if (!arr[i])
            {
                int squareI = i * i;
                for (int j = squareI; j <= number; j = j + i)
                {
                    arr[j] = true;
                }
            }

            for (int c = 1; c < number + 1; c++)
            {
                if (arr[c] == false)
                {
                    listPrimes.Add(c);
                }
            }

        }
        return listPrimes.ToArray();
    }
于 2013-01-01T12:00:58.117 に答える