为什么我在R中得到这两种算法的不同答案?

时间:2012-08-21 02:57:16

标签: r

这实际上是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

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

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

3 个答案:

答案 0 :(得分:6)

因为15的倍数会在第一个代码示例中添加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)。

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:1)

我可以在概念上告诉你为什么这是不正确的。

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

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

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