欧拉项目#1在R

时间:2014-02-10 20:23:26

标签: r for-loop while-loop

问题

查找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)

用语言逐行说明这就是我所理解的事情:

  1. x获得值0
  2. 我得到了价值1
  3. 而对象i的值(不是索引#)是&lt; 1000
  4. 如果可被3或5整除
  5. 将数字i添加到向量x
  6. 按顺序将i添加到i(为了使循环保持定义的限制为1e3
  7. 总结vector x
  8. 中的所有项目

    我猜x [i]&lt; - c(x,i)不是向向量x添加元素的正确方法。我该如何解决这个问题?还有哪些不准确?

5 个答案:

答案 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