求这样一个三位数,该三位数等于其每位数字的阶乘之和。

即 abc = a! + b! + c!

下面是实现的代码,但感觉太繁琐,有没有简化的方法。

<br />
a <- 100:999<br />
b <- data.frame(x=(a%/%100)%%10,y=(a%/%10)%%10,z=a%%10)<br />
d1 <- do.call(rbind,lapply(1:900,function(i) prod(b$x[i]:1)))<br />
d2 <- do.call(rbind,lapply(1:900,function(i) prod(b$y[i]:1)))<br />
d3 <- do.call(rbind,lapply(1:900,function(i) prod(b$z[i]:1)))<br />
s <- as.data.frame(cbind(d1,d2,d3))<br />
ss <- data.frame(x=a,y=rowSums(s))<br />
ss[which(ss$x==ss$y),]<br />
     x   y<br />
46 145 145<br />
#即145 = 1! + 4! +5!<br />
</p>

回复 第2楼 的 波波头一头:

多谢了哦,当时不知道有这个factorial ,用prod,参数传递不进去,所以只好用笨办法了。

<br />
a <- 100:999<br />
b <- data.frame(x=(a%/%100)%%10,y=(a%/%10)%%10,z=a%%10)<br />
d <- data.frame(x=factorial(b$x),y=factorial(b$y),z=factorial(b$z))<br />
s <- data.frame(x=a,y=rowSums(d))<br />
s[which(s$x==s$y),]<br />


另外询问一下,R中有没有提取每位数字的函数,如果有,还是可以简化的。
</p>

回复 第3楼 的 itellin:

<br />
a <- 100:999<br />
sapply(a, function(xxx)<br />
{<br />
sapply(as.integer(unlist(strsplit(as.character(xxx),NULL))),factorial)->inter<br />
sum(inter)==xxx<br />
}<br />
)->mm<br />
which(mm)</p>
<p>
</p>

回复 第1楼 的 itellin:

<br />
ind <- expand.grid(1:9,0:9,0:9)<br />
x <- 100*ind[,1]+10*ind[,2]+ind[,3]<br />
y <- factorial(ind[,1])+factorial(ind[,2])+factorial(ind[,3])<br />
x[x==y]<br />
</p>

回复 第4楼 的 luzifer:尽管看着头昏,但是解决了数字位数的拆分问题,不错。

回复 第5楼 的 suckbunny:你的更简单,直接对数字进行运算,太醒目了。