-3

このコードは、1 から 30 までの非素数を出力することを目的としています。どのように機能し、どこでエラーが発生していますか。

BEGIN  
    <<outer>>
    FOR i in 1..30
        <<inner>> 
        for k in 2..i-1 loop 
            if (mod(i, k) = 0) THEN 
                DBMS_OUTPUT.PUT_LINE(i);
                exit inner when (mod(i, k)= 0);
            end if;
        end loop inner
    end loop outer 
end;
4

3 に答える 3

1

これは「どのように機能しますか」という答えです。

外側のループは、1 ~ 30 の数字を処理します。

内側のループは、実際の非素数処理を行います。それは本当に後になってi = 4から始まります (1,2,3 が素数であるため)。ほとんどの非素数の場合、ループは while の後に終了し、k <= 3出力されiます。素数の場合、素数より小さいすべての数をループします。内側のループにいる場合のようi = 23に、2,3,4...22 を通過し、何も出力せずにループを完了します。

それは私が好きではない部分です。数を因数分解すると (特に 1 ~ 30 しか扱っていないため)、それらは 2 または 3 または別の素数で割り切れます。これがばかげた部分です。例に戻りますi = 23。mod(23, 3) と mod(23, 9) と mod(23, 18) の両方を処理します。もちろん、3 が 9 より余りを生成する場合、18 も同様に剰余を生成します (因数 3 の後続のすべての数も同様です)。

于 2013-04-23T14:44:26.957 に答える
0

コードは、すべての潜在的な候補をテストすることによって機能します。つまり、1 より大きく精査中の数よりも小さいすべての正の整数を意味します。受験者がテストされた数を余りなく割った場合、その数は合成され、出力されます。ハット番号に関するそれ以上のテストはスキップされます。

于 2013-04-23T14:43:58.213 に答える