如何在R中反转数字
我想写一个函数来反转任何数字的顺序。这是我的东西,但它不起作用。请帮帮我如何在R中反转数字,r,R,我想写一个函数来反转任何数字的顺序。这是我的东西,但它不起作用。请帮帮我 n=123 rev_number=function(n){ m=strsplit(as.character(n),"") if (m==rev(m)) print("reversed number") } 所需的输出是n=321我觉得整数应该留在整数世界,而不是进入字符串操作世界。在R中似乎没有用于此类任务的内置函数,因此我们可以创建一个,例如使用Rcpp包。这里有一个例子 library(Rcpp) cppFunc
n=123
rev_number=function(n){
m=strsplit(as.character(n),"")
if (m==rev(m)) print("reversed number")
}
所需的输出是
n=321
我觉得整数应该留在整数世界,而不是进入字符串操作世界。在R中似乎没有用于此类任务的内置函数,因此我们可以创建一个,例如使用Rcpp包。这里有一个例子
library(Rcpp)
cppFunction('int Reverse_CPP(int x) {
int reverse = 0;
while(x != 0) {
int remainder = x%10;
reverse = reverse*10 + remainder;
x/= 10;
}
return reverse ;
}')
Reverse_CPP(1234)
# [1] 4321
这是一个矢量化的版本
cppFunction('IntegerVector Reverse_CPP2(IntegerVector x) {
int n = x.size();
IntegerVector out(n);
IntegerVector xx = clone(x); // Will need this if you don"t want to modify x in place
for (int i = 0; i < n; ++i){
int reverse = 0;
while(xx[i] != 0) {
int remainder = xx[i]%10;
reverse = reverse*10 + remainder;
xx[i]/= 10;
}
out[i] = reverse;
}
return out;
}')
Reverse_CPP2(c(12345, 21331, 4324234, 4243))
# [1] 54321 13312 4324234 3424
对于整数,可以使用
n>9
:
reverse_int <- function(n) {
t1 <- floor(log10(n))
t2 <- 0
for (i in t1:1) t2 <- t2 + floor(n/10^i) * 10^(t1-i)
return(n*10^t1 - 99*t2)
}
reverse_int(678754)
#[1] 457876
reverse\u int一种R函数,用于根据连续幂为10的整数除法对数字进行反转。这是在一个与回文数字相关的学校项目中提出的
Reverse_number <- function(x){
n <- trunc(log10(x)) # now many powers of 10 are we dealing with
x.rem <- x # the remaining numbers to be reversed
x.out <- 0 # stores the output
for(i in n:0){
x.out <- x.out + (x.rem %/% 10^i)*10^(n-i) # multiply and add
x.rem <- x.rem - (x.rem %/% 10^i)*10^i # multiply and subtract
}
return(x.out)
}
>代码> ReaveSo数字,你能考虑发布样本输入和期望的输出吗?反转不仅仅是为了改变顺序吗?虽然这可能不是最好的方法,但我猜您正在尝试粘贴(rev(strsplit(as.character(n),“”)[[1]],collapse=”“)
。尽管如前所述,最好提供一个可复制的示例和所需的输出。谢谢大家。我刚刚用输入和期望的输出更新了我的问题。对于这样的问题,我想首先要看的地方是社区-所以,你可以使用ff=function(x)x*10^floor(log10(x))-99*sum(floor(x*10^(-seq_len(log10(x)))*10^(floor(log10(x))-seq_len(floor)(log10(x)))
<代码>ff(4568742)。您可以存储一些计算以避免重复它们。只需在第二个函数中做一个注释-如果输入“x”确实是“整数”(我假设在传递给函数之前会自动强制输入“double”),那么原始的“x”将被修改。@alexis_laz我不确定您的意思。如何才能反转12.3
?或者在这种情况下,您的ff
工作,而这不会工作?同样Reverse\u CPP2(例如,double(c(12,24))
也可以正常工作。而Reverse\u CPP2(as.double(12.3))
确实将转换为整数,而ff(12.3)
将返回其他一些结果。不管怎样,我都不明白你的评论。我指的是“typeof”;参见-例如-x1=12;反向_CPP2(x1);x1;x2=12L;反向_CPP2(x2);x2
@alexis_laz哇,我不知道那里发生了什么。你能指出一些关于那件事的文件吗?那么基本上说函数在适当的位置修改了x?我想“编写R扩展”会警告修改输入。在这种情况下,我相信,“Rcpp”会在输入的“typeof”与预期不匹配时自动使用(?)排序的强制执行器
(它返回一个不同的对象),而在匹配时,会操纵指向R对象的同一指针。(我想在这种情况下,只需将x[I]
保存到tmp
即可解决此问题)。
Reverse_number <- function(x){
n <- trunc(log10(x)) # now many powers of 10 are we dealing with
x.rem <- x # the remaining numbers to be reversed
x.out <- 0 # stores the output
for(i in n:0){
x.out <- x.out + (x.rem %/% 10^i)*10^(n-i) # multiply and add
x.rem <- x.rem - (x.rem %/% 10^i)*10^i # multiply and subtract
}
return(x.out)
}