我必须编写一个命令行,在两个不同的自定义基数中接受两个数字,并在第三个基数中输出。
所谓自定义基础,我的意思是我有这样的东西:
- 输入基数1:"
- 输入基数2:ajedpoi
- 输出:rAfeB oiX
所以从这个开始,我想bc
没有帮助,对吧?
有这样的命令吗?或者我应该写一些自定义脚本吗?你能给我一些线索吗?我完全迷路了。
编辑:练习的确切说明是:
在";?!base和FT_NBR2,并显示两者的总和在gtaio-luSnemf基地。
以一种具有以下值的方式:
FT_NBR1='?""'
FT_NBR2=rcrdmddd
我会得到以下输出:
Salut
如何将字符串789
转换为数字?
789等于
7×102+8×101+9×100
但我们正在编写一个程序,我们希望利用循环。
((7(×10+8(×10+9
更好的是,
((0(×10+7(×10+8(×10+9
我们不从数字7
、8
和9
开始,而是从它们的字符串表示开始。
(
(
(
0
) × 10 + [ offset of "7" in "0123456789" ]
) × 10 + [ offset of "8" in "0123456789" ]
) × 10 + [ offset of "9" in "0123456789" ]
最后,让我们消除对10号垒的最后一点依赖。
(
(
(
0
) × [ number of symbols in "0123456789" ] + [ offset of "7" in "0123456789" ]
) × [ number of symbols in "0123456789" ] + [ offset of "8" in "0123456789" ]
) × [ number of symbols in "0123456789" ] + [ offset of "9" in "0123456789" ]
所以代码看起来是这样的:
- 将
n
设置为0 - 将
base
设置为基数中的符号数 - 对于每个数字,
- 将
n
设置为n
和base
相乘的结果 - 获取构成基数的符号数组中数字的偏移量
- 将
n
设置为n
和偏移量相加的结果
- 将
Perl实现示例:
my @syms = split //, "01234567890";
my %sym_offset = map { $syms[$_] => $_ } 0 .. $#syms;
my $s = "...";
my $n = 0;
for my $sym ( split //, $s ) {
my $offset = $sym_offset{ $sym };
$n = $n * @syms + $offset;
}
$s = $syms[ 0 ] if !length( $s );
say $n;
这个过程的反面可以用来取一个数字并将其转换为基数。与其重复相乘,不如重复除法,将余数作为构成基数的符号列表的索引。
- 将
base
设置为基数中的符号数 - 将
s
设置为空字符串 - 当CCD_ 15大于零时,
- 求
n
除以base
的余数 - 获取在等于余数的偏移处找到的符号
- 将符号准备为
s
- 将
n
设置为从n
减去余数的结果 - 将
n
设置为n
除以base
的结果
- 求
- 如果CCD_ 24是空字符串,
- 将
s
设置为第一个符号
- 将
Perl实现示例:
my @syms = split //, "01234567890";
my %sym_offset = map { $syms[$_] => $_ } 0 .. $#syms;
my $n = ...;
my $s = "";
while ( $n ) {
my $offset = $n % @syms;
$s = $syms[ $offset ] . $s;
$n = ( $n - $offset ) / @syms;
}
say $n;
嗯,我不够聪明。我只需要tr
和bc
就可以做到
我使用CCD_;碱基";CCD_ 29。
以下是我所做的:
#!/bin/sh
NUM1=$(echo "$FT_NBR1" | tr '\\"?! '01234')
NUM2=$(echo "$FT_NBR2" | tr mrdoc '01234')
RES=$(echo "obase=13; ibase=5; $NUM1 + $NUM2" | bc)
echo $RES | tr '0123456789abc' 'gtaio luSnemf'