0

这确实是 Project Euler 中的第一个问题。我创建了这两种算法来解决它,但它们各自产生不同的答案。基本上,工作是编写一个程序,将 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

谁能告诉我为什么这两个给出不同的答案?第一个是正确的,显然是更简单的解决方案。但我想知道为什么第二个不正确。

编辑:在事故中捏造了第二个答案。

4

3 回答 3

6

因为 multiples15将在第一个代码示例中添加i一次,在第二个代码示例中添加两次。的倍数是15的倍数。3 5

为了使它们在功能上相同,第二个必须是这样的:

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

但是,老实说,你的第一个样本对我来说似乎更合乎逻辑。

顺便说一句(现在你已经编辑过它了),我还猜测你的第二个输出值 26633 是一个错字。除非 R 在某个时候包含整数,否则我希望它第一个示例更多(例如我从类似的 C 程序中获得的值 266333,所以我假设你不小心离开了 3)。

于 2012-08-21T03:01:08.807 回答
1

我不太了解 R,但马上,我看到了一个潜在的问题。

在您的第一个代码块中,如果一条件为真,则该if语句为真。如果两个条件都满足,您的第二个块将运行该语句两次。if

考虑数字15。在您的第一个代码块中,该if语句将触发一次,但在第二个代码块中,两个if语句都将触发,这可能不是您想要的。

于 2012-08-21T03:01:55.433 回答
1

从概念上讲,我可以确切地告诉你为什么这是不正确的。

将所有整数的总和乘以 333 并乘以 3,您将得到 x 将所有整数的总和乘以 200 并乘以 5,您将得到 y 将所有整数的总和乘以 66 并乘以15,你会得到 z

x + y = 266333 x + y - z = 233168

15 可以被 3 和 5 整除。你已经数过所有 15 的倍数两次。

于 2013-04-02T19:34:34.247 回答