3

ここでの目標は、1 から 100 までのすべての素数を見つけて出力するプログラムを作成することでした。私は物事を複雑にし、非効率的なコードを作成する傾向があることに気付きました。ここでもそれを行ったと確信しています。最初のコードは私のもので、コメント タグの間に入れたものはすべて、解決策として本に記載されているコードです。

// Find all prime numbers between 1 and 100

#include <iostream>
#include <cmath>
using namespace std;

    int main()
    {
        int counter; // loop counter
        int count_two; // counter for second loop
        int val; // equals the number of count, used in division to check for primes
        bool check;

        check = true;

        for(counter = 1; counter <= 100; counter++){
            val = counter;
                for(count_two = 2; count_two <= 9; count_two++){
                    if((val % count_two) == !(check)){
                        cout << val << " is a prime number.\n";
                }
          }
    }
    return 0;
}
// program didn't work properly because of needless complication; all that needs to be checked for is whether a number is divisible by two

/*
*********correct code***********
#include <iostream>
using namespace std;
int main()
{
    int i, j;
    bool isprime;
    for(i=1; i < 100; i++) {
        isprime = true;
    // see if the number is evenly divisible
    for(j=2; j <= i/2; j++)
    // if it is, then it is not prime
        if((i%j) == 0) isprime = false;
        if(isprime) cout << i << " is prime.\n";
}
return 0;
}
********************************
*/

私が収集できることから、私はここでかなり正しい道を歩んでいました。二重ループと変数の使いすぎで物事を複雑にしたと思います。おそらく、プログラムが正しく動作しない可能性があります。必要に応じて出力を投稿できますが、それは確かに間違っています。

私の質問は基本的にこれです:正確にどこで間違ったのですか?自分でコードを修正したいので、誰かがこれをやり直す必要はありませんが、しばらくこれを見てきましたが、なぜ私のコードが機能しないのかよくわかりません。また、私はこれが初めてなので、構文/読みやすさに関する入力も役に立ちます。前もって感謝します。

4

2 に答える 2

5

そのままでは、コードは、 2 から 9 までの数字のいずれかで割り切れる場合、その数字は素数であると言っています。どこかの変数それがallであり、 anyではないことを要求する必要があり、これも変更する必要があります。ライン:bool

if((val % count_two) == !(check)){

check=であるためtrue、これは次のように解決されます。

if ((val % count_two) == !true){

if ((val % count_two) == false){

if ((val % count_two) == 0){

(値falseが に変換される方法に注意してください0。一部の言語では、ここでコンパイル エラーが発生します。C++ では整数に変換されます)。

実際、これはあなたが望むこととは反対のことをします。代わりに、これを書いてください。これは正しく、より明確です。

if (val % count_two != 0) {

最後に、読みやすさ (および利便性) のためにできることの 1 つは、、、およびの代わりにi、、、およびと書くことです。これらの 3 文字は、プログラマーによってループ カウンターとして広く認識されています。jkcountercount_twocount_three

于 2013-05-06T02:13:32.033 に答える
2

上記のポイントに加えて:

  1. ループを 2 つ持つ必要はないと考えていたようです。両方必要です。
  2. 現在、コードでは、内側のループの上限は外側のループの値に依存していません。しかし、これは正しくありません。sqrt(outer_loop_value) で割り切れるかどうかをテストする必要があります。「正しい」コードでは、outer_loop_value の半分を使用していることに注意してください。これはパフォーマンスのトレードオフになる可能性がありますが、厳密に言えば、sqrt() までテストする必要があります。ただし、外側のループが最大 7 であり、内側のループが 9 まで除算をテストしており、7 がその範囲内にあると考えてください。つまり、7 は素数ではないと報告されます。
  3. 「正しい」コードでは、インデントによりコードの解釈が難しくなります。内側の for ループには 1 つの命令しかありません。そのループは、可能なすべての除数をループします。これは不要であり、mod がゼロになる最初のポイントで発生する可能性があります。しかし重要なのは、if(isprime) cout << i << " is prime.\n";これが内側のループではなく、外側のループで起こっているということです。あなたの(コメントされていない)コードでは、それを内側のループに入れており、これにより外側のループ値ごとに複数の応答が発生します。
  4. スタイル上、カウンターを新しい val 変数にコピーする必要はありません。
于 2013-05-06T02:42:16.037 に答える