输入一个任意的五位整数abcde,输出一维数组(e,d,c,b,a)
这是我本科时C语言课上的一个问题。实质是将一个五位数的每一位单独提取出来赋值给数组的元素,然后逆序输出。把这个问题变得复杂一点:
输入一个任意的大于0的整数,把它倒过来。
拆解这个问题:
计算出输入的数有多少位,来决定循环次数
提取每一位上的数,创建成一个向量
将向量变回一个数
有多少位
假设输入的是一个n数x,要做的就是通过x计算出n来。
因为任何一个n位正数X都能表示为
所以
又因为
,所以
考虑到a可能等于1(此时
),因此将
直接向上取整可能会得到n-1而不是n,应该先向下取整再加一,也就是floor(log10(X))+1.
X=12345 #输入
n=floor(log10(X))+1 #求位数
如果安装了tidyverse包,就可以使用管道操作来完成
n=X%>%log10()%>%floor()+1
%>%是管道操作符,作用是将左侧的运算结果传递给右侧的函数,x%>%f()%>%g()就相当于g(f(x)),使用管道操作的优点是1.增加代码的可读性;2.不需要创建中间变量。在需要进行数据转换时管道操作非常有用。
怎样提出从右到左的第
位数来
我想讲得复杂一点。先来看这个问题:
十进制是什么?
任何一个正实数
,都可以表示成
所以
就是用十进制表示
的结果。例如
因为十进制是最常见的进位制,所以下标的
一般都省略掉了,在使用其他进位制时一般要标出来。
回到最初的问题,怎样提出从右到左的第
位数,也就是
?先将
对
取余,再用
整除得到的结果,商就是这一位的数。在R中,取余运算符是%%,整除运算符是%/%,所以提取
的语句是X%%10^(i)%/%10^i。
接下来我们就可以写出循环语句来计算每一位上的数:
a=c() #创建一个空的一维向量
for(i in 1:n){
a[i]=X%%10^(i)%/%10^i
}
这样得到的向量a本身就是倒序的,a[1]是X的个位,a[2]是X的十位,以此类推。
把向量a变回一个数
之前解释了十进制,所以逆向操作一下。要注意的是,a[n]是输出的数的个位,a[1]才是最高位。
b=c()
for(i in 1:n){
b[i]=a[i]*10^(n-i)
}
sum(b)
也可以用函数来代替向量b。在经过简单的搜索之后,我发现R的自带函数不能创建等比数列,不过编一个也很简单
#等比数列是geometric progression,所以函数就叫gepr吧
gepr=function(a1,q,n){
a=c()
for(i in 1:n){
a[i]=a1*q^(i-1)
}
return(a)
}
#为了计算十进制,可以更简单一点
asten=function(n){
a=c()
for(i in 1:n){
a[i]=10^(i-1)
}
return(a)
}
接下来就有了把向量a变成一个数的另一种方法
sum(a[n:1]*asten(n))
把一个数倒过来的函数
#已经装载了tidyverse
reverse=function(x){
n=x%>%log10()%>%floor()+1
a=c()
b=c()
for(i in 1:n){
a[i]=x%%10^(i)%/%10^(i-1)
}
for(i in 1:n){
b[i]=a[i]*10^(n-i)
}
b%>%sum()%>%return()
}
试验一下
> reverse(378594)
[1] 495873
这东西有什么用?
没用。