问题
查找1000以下可以被3或5整除的所有数字的总和
我创建了一个解决方案:
x <- c(1:999)
values <- x[x %% 3 == 0 | x %% 5 == 0]
sum(values
第二种解决方案我无法开展工作并需要帮助。我把它贴在下面。 我正在尝试使用循环(在这里,我使用while(),然后我会尝试())。我仍然在努力保持对索引(向量中的位置)的引用与向量内的值/观察分开。循环似乎让我更难以区分这两者。
为什么这不会产生欧拉#1的答案?
x <- 0
i <- 1
while (i < 100) {
if (i %% 3 == 0 | i %% 5 == 0) {
x[i] <- c(x, i)
}
i <- i + 1
}
sum(x)
用语言逐行说明这就是我所理解的事情:
我猜x [i]&lt; - c(x,i)不是向向量x添加元素的正确方法。我该如何解决这个问题?还有哪些不准确?
答案 0 :(得分:4)
首先,你的循环一直运行到i < 100
,而不是i < 1000
。
其次,将x[i] <- c(x, i)
替换为x <- c(x, i)
,以向向量添加元素。
答案 1 :(得分:3)
这是执行此总和的快捷方式,这可能更符合问题的精神:
3*(333*334/2) + 5*(199*200/2) - 15*(66*67/2)
## [1] 233168
这就是为什么这样做的原因:
在整数集[1,999]
中有:
333可被3整除的值。它们的总和为3*sum(1:333)
或3*(333*334/2)
。
可被@整除的199个值。它们的总和为5*sum(1:199)
或5*(199*200/2)
。
添加这些数字会得到一个数字,它的交点太高,这是可以被15整除的值。有66个这样的值,它们的总和是15*(1:66)
或15*(66*67/2)
作为N的函数,可以这样写:
f <- function(N) {
threes <- floor(N/3)
fives <- floor(N/5)
fifteens <- floor(N/15)
3*(threes*(threes+1)/2) + 5*(fives*(fives+1)/2) - 15*(fifteens*(fifteens+1)/2)
}
,并提供:
f(999)
## [1] 233168
f(99)
## [1] 2318
答案 2 :(得分:1)
另一种方式:
x <- 1:999
sum(which(x%%5==0 | x%%3==0))
# [1] 233168
答案 3 :(得分:1)
非常高效的方法如下:
div_sum <- function(x, n) {
# calculates the double of the sum of all integers from 1 to n
# that are divisible by x
max_num <- n %/% x
(x * (max_num + 1) * max_num)
}
n <- 999
a <- 3
b <- 5
(div_sum(a, n) + div_sum(b, n) - div_sum(a * b, n)) / 2
相比之下,非常短代码如下:
x=1:999
sum(x[!x%%3|!x%%5])
答案 4 :(得分:0)
这是一个替代方案,我认为给出相同的答案(使用99而不是999作为上限):
iters <- 100
x <- rep(0, iters-1)
i <- 1
while (i < iters) {
if (i %% 3 == 0 | i %% 5 == 0) {
x[i] <- i
}
i <- i + 1
}
sum(x)
# [1] 2318
以下是原帖中提到的for-loop
:
iters <- 99
x <- rep(0, iters)
i <- 1
for (i in 1:iters) {
if (i %% 3 == 0 | i %% 5 == 0) {
x[i] <- i
}
i <- i + 1
}
sum(x)
# [1] 2318