分享

笨办法学R编程(三)

本帖最后由 nettman 于 2014-7-4 15:49 编辑
问题导读:
1、什么是apply函数?

2、如何采用质因子分解的思路编程?




前言
随着教程推进,基本的语法都接触得差不多了。当要解决某个具体问题时,只需要考虑用什么样的算法来整合运用这些函数和表达式。今天来解决Project Euler的第五个问题,该问题可以用很笨的暴力搜索法子来作,但是更聪明的作法是采用质因子分解的思路。即任何一个合数都可以分解为质数的乘积。为了完成这个题目,还需要学习一点点矩阵,以及和sapply函数相似的另一个函数apply。
  1. # 预备练习
  2. mat <- matrix(1:12,ncol=4)
  3. print(mat)
  4. t(mat)
  5. colnames(mat) <- c('one','two','three','four')
  6. rownames(mat) <- c('a','b','c')
  7. print(mat)
  8. apply(mat,1,sum)
  9. apply(mat,2,sum)
  10. sum(apply(mat,2,sum))
  11. prod(apply(mat,2,sum))
  12. # 之前建立的判断是否为质数的函数
  13. findprime <- function(x) {
  14. if (x %in% c(2,3,5,7)) return(TRUE)
  15. if (x%%2 == 0 | x==1) return(FALSE)
  16. xsqrt <- round(sqrt(x))
  17. xseq <- seq(from=3,to=xsqrt,by=2)
  18. if (all(x %% xseq !=0)) return(TRUE)
  19. else return(FALSE)
  20. }
  21. x = 1:20
  22. prime <- x[sapply(x,findprime)]
  23. # 欧拉问题五,寻找最小的能被1到20所整除的数。
  24. # 建立分解质因子的函数
  25. primefactor <- function(x,prime)
  26. {
  27. m <- length(prime)
  28. fac.count <- numeric(m)
  29. names(fac.count) <- prime
  30. for (i in 1:m)
  31. { prime.num <- prime[i]
  32. while (x %% prime.num == 0 & x !=1 )
  33. {
  34. fac.count[i] <- fac.count[i] + 1
  35. x = x / prime.num
  36. }
  37. }
  38. return(fac.count)
  39. }
  40. # 上面的函数负责对一个20以下的数分解为多个质数之积
  41. # 返回每个质因子对应的自乘次数
  42. primefactor(18,prime)
  43. # 对1到20每个数进行质因子分解,形成一个表格
  44. result <- t(sapply(1:20,primefactor,prime))
  45. # 求每列的极大值
  46. prime.power <- apply(result,2,max)
  47. prod(prime^prime.power)
复制代码





最终结果是232792560  


已有(1)人评论

跳转到指定楼层
x5136160 发表于 2014-7-11 08:02:57
了解了解,看看。。。。。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条