0

以下は素数の計算です。ループをよりよく理解するために、それを分解しようとしていました。また、この関数を微調整して、この方法ではなく、数値をその平方根と比較して素数を見つけたいと思います。

(int mainの前に適切な宣言が行われると想定します)

//数値が素数かどうかを判断します

bool isPrime (long n)
{
    int a;

    if (n == 1)
    {
        return false;
    }

    for (a = 2; a <= (n / 2); a++)
    {
        if ((n % a) == 0)
        {
            return false;
        }

    }
    return true;
}

ただし、このループを観察すると、最初にこの関数を正しく観察しているかどうかを確認するための質問があります。私が見ると、それはカウンターのように見えint a;、0と1は素数ではないので、2から始まります。nは正式な変数である必要があります。2で割ったときにそれ自体以下のすべての数値について、ゼロより大きい余りがある場合はブール値に対してtrueを返すと記載されています。同時に、数値が2で均等に除算された場合(つまり余りがない場合)、素数とは見なされません(ブール値はfalseを返します)。それは正しいと思いますか?そうでない場合は、どこで間違った方向に曲がったか教えてください。正しければ、プログラムの後半に進みます。

ここで、メインprimeCount;で制限されてprimeCount (2, 50000);いますが、最初の関数はここにフィードします:

//isPrime関数を使用して素数をカウントして整理します

long primeCount (long x, long y)
{
    bool prime;
    int b;
    int c = 1000;
    int counter = 0;
    int totalSum = 0;

    for (b = 1; b <= y; b++)
    {
        prime = isPrime (b);

        if (prime == true)
        {
            counter++;
        }
        if (b == c)
        {
            cout << setw(10) << left << (b - 999) << setw(10) << left << b << setw(12) << counter << endl;
            cout << fixed << showpoint << setprecision(2) << endl;
            totalSum = totalSum + counter;
            counter = 0;
            c = c + 1000;
        }
    }

ここで、xとyは正式な変数であると思いますが、xが何を表すのかわかりません。それは表していint c;ますか?その関数のforループは私を完全に混乱させました。わかりません。その上に当てることができるどんな光でもありがたいです。

平方根の照会に関しては、素数を取得するために3つのネストされたforループを使用する必要がありますか?

 for (a > m => b)

  for (a==m => b==m)

    for (a < m => b>m)

この方法で素数を見つけることは、ここに示されている方法よりも多かれ少なかれ複雑でしょうか?私はこれが取り組むべきことがたくさんあることを知っています。別々の投稿に分割することを提案された場合は、これを編集して後半を別の投稿に投稿します。助けてくれてありがとう!このようなものから頭と尻尾を作ろうとしている新入生のC++プログラマー:)

4

2 に答える 2

1

最初の関数isPrime()は、想定されていることを行います。数値が素数の場合は true を返し、そうでない場合は false を返します。ループ変数aが終了までしか実行されない理由n/2は、どの数値も(それ自体を除いて)nより大きい因数を持つことができないためです。n/2例?6 -- 1, 2, 3 and 612 -- 1, 2, 3, 4, 6 and 12。ループはa、因数 (剰余を残さずに除算する数) があるかどうかを確認しようとしています。そうである場合、それは素数 ( return false) ではなく、そうでない場合は ( return true) です。

primeCount()しかし、意図したことを完全には実行していないと感じています。

の定義から、からまでprimeCount()の素数の総数を計算することを意図していると思います(あなたの場合は 2 から 50000です。ただし、これを行うには、ループをこれに変更する必要がありますxymain()primeCount(2, 50000)for

for (b = x; b <= y; b++)

ここでの変数の役割はc、ループ変数の 1000 番目ごとの値をチェックすることですb

b = 10001 回目の実行で、プログラムがこれまでに遭遇b == cした素数の数を出力することに注意してください( counter)。その後、counterは にリセットされ0c現在です。その後、から に進み2000、同じことが 50000まで繰り返されます。b10012000b

全体として、アイデアは から までの 1000 個の自然数ごとに存在する素数の数を出力2すること50000です。

于 2013-02-27T03:56:43.980 に答える
0
for (a = 2; a <= (n / 2); a++)
{
    if ((n % a) == 0)
    {
        return false;
    }

}

これは、使用する「for」ループです。2 から n/(n の半分 (整数除算)) まで繰り返し、各 "a" で除算するときの n の剰余をチェックします。これらの剰余のいずれかがゼロの場合、n は合成であり、先に進む意味はありません。false を返すだけです。数値は素数ではありません。

(n/2) まで n の約数を見つけられなかった場合、その数は素数であると想定しても安全です。そのため、その後、可能なすべての約数の推測を試み、そこまで到達した場合は、その数が IS であることを返します。プライム。

于 2013-02-27T03:56:37.690 に答える