-2

私はオンラインチャレンジをしていて、1つの問題に遭遇しました! 紙の上でロジックを作成しましたが、問題がうまくいかないようです。出力として 0 を返すだけです。

これまでの私のコード:

#include <iostream>

using namespace std;

int main()
{
    int n;
    cin >> n;
    int nums[50];
    string res[50];
    int o = 0;
    for(int i=0;i<n;i++)
    {
        cin >> nums[i];
    }
    for(int i=0;i<n;i++)
    {
        int deliteli=1;
        for(int j=1;j<=nums[i];j++)
        {
            if(nums[i]%j==0)
            {
                deliteli++;
            }
        }
        if(deliteli == 2){
            res[0] = "YES";
            o++;
        }
        else if(deliteli != 2){
            res[0] = "NO";
            o++;
        }
    }
    for(int i=0;i<o;i++)
    {
        cout << res[i] << endl;
    }
    return 0;
}

私がやっていることは、最初に N 数を入力することです。これは、配列の長さを意味し、配列内の各数値が素数かどうかを確認します。私が間違っていることは何ですか?

4

4 に答える 4

2

nums[i]で割れるかどうかをチェックするためjにやっているj%nums[i]==0が、それは である必要があるnums[i]%j==0

カウンターdeliteliにも問題があります。番号ごとに再初期化する必要があります。そうしないと、単に追加されます。

また、常に設定res[0]していますが、設定したいでしょうres[i]

于 2013-04-06T21:34:47.540 に答える
2
  • deliteli0 から開始する必要があります。

  • deliteliループの開始時にリセットする必要があります。

  • res[i]の代わりに使用しres[0]ます。そうしないと、最初の要素を上書きし続けます。

  • j%nums[i]で割った余りを返すためnums[i]%j、 である必要があります。a%bab

  • '単一の文字のみを対象としています (C++ は、コンパイルおよび実行を許可してはならないものを許可することに完全に満足しています)。"文字列用です。

最終的なコード:

#include <iostream>

using namespace std;

int main()
{
    int n;
    cin >> n;
    int nums[50];
    string res[50];
    int o = 0;
    for(int i=0;i<n;i++)
    {
        cin >> nums[i];
    }
    for(int i=0;i<n;i++)
    {
        int deliteli=0;
        for(int j=1;j<=nums[i];j++)
        {
            if(nums[i]%j==0)
            {
                deliteli++;
            }
        }
        if(deliteli == 2){
            res[i] = "YES";
            o++;
        }
        else if(deliteli != 2){
            res[i] = "NO";
            o++;
        }
    }
    for(int i=0;i<o;i++)
    {
        cout << res[i] << endl;
    }
    return 0;
}

テスト

于 2013-04-06T21:41:10.837 に答える
1

最初に: で割ることができるかどうかを確認nums[i]します。jj%nums[i]==0nums[i]%j==0

2番目:for(int j=1;j>=nums[i];j++) に変更for(int j=1;j<=nums[i];j++)

そして最後に:これまでの数をテストする必要はありませんが、これの平方根だけをテストする必要があるので、に変更してください。アルゴリズムの速度がわずかに向上する可能性があります。nums[i]nums[i]sqrt(nums[i])+1

于 2013-04-06T21:41:20.927 に答える