这实际上是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
谁能告诉我为什么这两个给出不同的答案?第一个是正确的,显然是更简单的解决方案。但我想知道为什么第二个不正确。
编辑:事故中捏造了第二个答案。答案 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的所有倍数。