shell:使用自定义数字基数的算术



我必须编写一个命令行,在两个不同的自定义基数中接受两个数字,并在第三个基数中输出。

所谓自定义基础,我的意思是我有这样的东西:

  • 输入基数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

我们不从数字789开始,而是从它们的字符串表示开始。

(
(
(
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" ]

所以代码看起来是这样的:

  1. n设置为0
  2. base设置为基数中的符号数
  3. 对于每个数字,
    1. n设置为nbase相乘的结果
    2. 获取构成基数的符号数组中数字的偏移量
    3. 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;

这个过程的反面可以用来取一个数字并将其转换为基数。与其重复相乘,不如重复除法,将余数作为构成基数的符号列表的索引。

  1. base设置为基数中的符号数
  2. s设置为空字符串
  3. 当CCD_ 15大于零时,
    1. n除以base的余数
    2. 获取在等于余数的偏移处找到的符号
    3. 将符号准备为s
    4. n设置为从n减去余数的结果
    5. n设置为n除以base的结果
  4. 如果CCD_ 24是空字符串,
    1. 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;

嗯,我不够聪明。我只需要trbc就可以做到

我使用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'

最新更新