0

これは文字通り Project Euler の最初の問題です。それを解決するためにこれら 2 つのアルゴリズムを作成しましたが、それぞれ異なる答えが得られます。基本的に、仕事は 3 と 5 の 1000 未満のすべての積を合計するプログラムを書くことです。

これが正しいものです:

divisors<-0


for (i in 1:999){
    if ((i %% 3 == 0) || (i %% 5 == 0)){
        divisors <- divisors+i 
        }
    }

それがもたらす答えは233168です

ここに間違ったものがあります:

divisors<-0

for (i in 1:999){
    if (i %% 3 == 0){
        divisors <- divisors + i
        }
    if (i %% 5 == 0){
        divisors <- divisors + i 
        }
    }

これにより、答えが得られます 266333

これら2つの答えが異なる理由を誰か教えてもらえますか? 最初の方が正しく、明らかに簡単な解決策です。しかし、2番目が正しくない理由を知りたいです。

編集:事故で2番目の答えをごまかしました。

4

3 に答える 3

6

の倍数は、最初のコード サンプルでは 115、2 番目のコード サンプルでは 2 回加算されるためです。の倍数はの倍数です。i153 5

それらを機能的に同一にするために、2番目は次のようにする必要があります。

divisors<-0
for (i in 1:999) {
    if (i %% 3 == 0) {
        divisors <- divisors + i
    } else {
        if (i %% 5 == 0) {
            divisors <- divisors + i 
        }
    }
}

しかし、正直なところ、あなたの最初のサンプルは私にははるかに論理的に思えます。

余談ですが(編集したので意味がありません)、2番目の出力値 26633 はタイプミスだと思います。R がある時点で整数をラップしない限り、最初の例 (同様の C プログラムから取得した値 266333 など)よりも大きいと予想されるため、誤って 3 を残したと想定しています)。

于 2012-08-21T03:01:08.807 に答える
1

R についてはよくわかりませんが、すぐに問題が発生する可能性があります。

最初のコード ブロックでは、条件のいずれかifが true の場合、ステートメントは trueです。両方の条件が満たされた場合、2 番目のブロックはステートメントを 2 回実行します。if

数を考えてみましょう15。最初のコード ブロックではifステートメントが 1 回トリガーされますが、2 番目のコード ブロックでは両方のifステートメントがトリガーされます。

于 2012-08-21T03:01:55.433 に答える