把每一个数倒过来c语言,R语言学习笔记——怎样把一个数倒过来

输入一个任意的五位整数abcde,输出一维数组(e,d,c,b,a)

这是我本科时C语言课上的一个问题。实质是将一个五位数的每一位单独提取出来赋值给数组的元素,然后逆序输出。把这个问题变得复杂一点:

输入一个任意的大于0的整数,把它倒过来。

拆解这个问题:

计算出输入的数有多少位,来决定循环次数

提取每一位上的数,创建成一个向量

将向量变回一个数

有多少位

假设输入的是一个n数x,要做的就是通过x计算出n来。

因为任何一个n位正数X都能表示为

math?formula=X%3Da%5Ctimes10%5E%7Bn-1%7D%5C%20%2C1%5Cleq%20a%3C10

所以

math?formula=lg(X)%3Dlga%2B(n-1)

又因为

math?formula=1%5Cleq%20a%3C10,所以

math?formula=0%5Cleq%20lga%3C1%2C%5C%20n-1%5Cleq%20lg(X)%3Cn

考虑到a可能等于1(此时

math?formula=lga%3D0),因此将

math?formula=lg(X)直接向上取整可能会得到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.不需要创建中间变量。在需要进行数据转换时管道操作非常有用。

怎样提出从右到左的第

math?formula=%5C%20i%5C位数来

我想讲得复杂一点。先来看这个问题:

十进制是什么?

任何一个正实数

math?formula=%5C%20X%5C,都可以表示成

math?formula=X%3Da_0%5Ctimes%2010%5E0%2Ba_1%5Ctimes10%5E1%2Ba_2%5Ctimes10%5E2%2B%5Cdots%2Ba_n%5Ctimes%2010%5E%7Bn-1%7D%2Ca_%7Bi%7D%5Cin%5C%7B0%2C1%2C2%2C3%2C4%2C5%2C6%2C7%2C8%2C9%5C%7D

所以

math?formula=%7Ba_na_%7Bn-1%7D%5Cdots%20a_1%7D_%7B(10)%7D就是用十进制表示

math?formula=X的结果。例如

math?formula=%7B12345%7D_%7B(10)%7D%3D5%5Ctimes10%5E0%2B4%5Ctimes10%5E1%2B3%5Ctimes10%5E2%2B2%5Ctimes10%5E3%2B1%5Ctimes10%5E4

因为十进制是最常见的进位制,所以下标的

math?formula=%5C%20(10)%5C一般都省略掉了,在使用其他进位制时一般要标出来。

回到最初的问题,怎样提出从右到左的第

math?formula=%5C%20i%5C位数,也就是

math?formula=%5C%20a_i%5C?先将

math?formula=%5C%20X%5C

math?formula=%5C%2010%5E%7Bi%2B1%7D取余,再用

math?formula=%5C%2010%5Ei%5C整除得到的结果,商就是这一位的数。在R中,取余运算符是%%,整除运算符是%/%,所以提取

math?formula=%5C%20a_%7Bi%7D%5C的语句是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

这东西有什么用?

没用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值