1。征求意见
您的目标是获取一系列字符,这些字符可以作为一个完整的字符串或一个接一个地组合在一起。如果你取一个完整的字符串,那么你必须逐个字符地读取它,如果你一次取一个字符,你已经完成了。
2。将数字转换为数字
您阅读的字符是字形、符号。计算机中的符号(与其他一切一样)用数字表示。完成此映射的方式是您的(字符集)编码。无需进入广阔的编码领域,您就可以依靠这样一个事实,即十进制数字的字形在大多数西方编码中都使用相同的数字进行编码,特别是您可以假设 ASCII 编码。
如果你查看一个 ASCII 表,你会看到这个
Character 0 1 2 3 4 5 6 7 8 9
Encoding 30h 31h 32h 33h 34h 35h 36h 37h 38h 39h
因此,如果用户输入 1234,您在字符串 31h 32h 33h 34h 中有这些字节。
您的目标是将编码转换为数字,例如 char '4' 的编码为 34h,而您希望将其转换为值 4h。
对于从 2 到 36 的基数,这可以通过基本算术来完成,更多花哨的基数可能需要查找表。
不要忘记验证输入!检查字符串中的有效字符!
3。从数字计算数字
现在您有了一个数字序列,我们称它们为dn, ..., d3, d2, d1, d0,其中dn 是用户输入的第一个数字,d0 是最后一个数字。
你想从这个数字创建一个数字。你知道像1234 这样的数字实际上意味着1*10^3 + 2*10^2 + 3*10^1 + 4。
所以你要做的很简单:
dn*10^n + ... + d3*10^3 + d2*10^2 + d1*10^1 + d0
(这解释了我对下标的选择)
考虑到n 是变化的(对于 16 位数字,最小值为 1,最大值为 5),您可以通过累积部分结果来简化此计算。
这意味着您有部分结果 temp 最初为 0。每次您有一个新数字 di 您执行
tmp = tmp*10 + di
说服自己,这有效地计算了上面的总和。这种方法免费带来了一个很好的功能,即计算数字的低 16 位,这对于不适合 WORD 的数字通常是一种优雅的降级。
4。伪算法
n = 0;
t = 0;
while (1)
{
c = get_char_from_input();
if (end_of_input(c) || max_digits_read(n))
break;
d = get_digit_from_char(c);
t = t * 10 + d;
n = n + 1;
}
return t;
开发一个高效的汇编版本由你来完成。