经历了前面两个小挑战,你应该对R有点理解了。我们继续推进,今天的问题有点点复杂,复杂的不是R,而是一个数学概念:质数和质因子。任何一个合数都可以被几个质数所分解,这个很重要,我们将用它来解决Project Euler的。还是和之前一样的,你需要自己在R控制台中敲打下面这些命令,根据结果自行揣摩其用处。 # 预备练习,学习for循环、建立自定义函数和其它一些函数 for (n in 1:10) { ((n)) } x <- ('hello','world','I','love','R') for (n in x) { (n) } x <- (from=1,to=10,=1) (x) x <- (from=1,to=10,=2) (x) x <- (from=1,to=2,length.out=10) (x) (x) x > 1.5 (x>1.5) (x>1.5) # 如何自定义一个求圆面积的函数 myfunc <- (r) { <- pi*r^2 () } (myfunc(4)) # 同时求四个不同半径圆的面积 r <- (2,2,4,3) (X=r,FUN=myfunc) # Project Euler 3 # 找到600851475143这个数的最大质因子 # 先建立一个函数以判断某个数是否为质数 findprime <- (x) { if (x %in% (2,3,5,7)) (TRUE) if (x%%2 == 0 | x==1) (FALSE) xsqrt <- ((x)) xseq <- (from=3,to=xsqrt,=2) if ((x %% xseq !=0)) (TRUE) else (FALSE) } # 列出1到100的质数,看函数对不对 x = 1:100 x[(x,findprime)] # 寻找最大的质因子 n <- 600851475143 for (i in (from=3, to=((n)), =2)) { if (findprime(i) & n %% i == 0) { n <- n / i prime.factor <- i if (i >= n) break } } (prime.factor)
最后的结果是6857。本例中除了使用for循环外,还见到了sapply函数,这是R语言中非常重要的一类向量化计算函数。求质数的方法可以参考 ,本例使用的是其中的境界4。实际上根据质因子的性质,本例不一定非要建立判断质数的函数,不过这个函数我们在后面会用到的。另外如果你想用其它软件找这个数字的质因子,也可以看看 。
from 数据科学与R语言 http://xccds1977.blogspot.com/