ADT整数类问题

ADT Integer class questions

本文关键字:问题 整数 ADT      更新时间:2023-10-16

我对编程很陌生,我必须为整数做一个抽象数据类型(ADT)。

我已经浏览了一些提示,例子,教程,但我找不到任何有用的,所以我希望我能在这里得到一些答案。我想了很多关于如何格式化存储我的整数的ADT我在想这样的东西:

int lenght; // stores the length of the number(an limit since this numbers goes to infinite)
int[] digits; // stores the digits of my number, with the dimension equal to length

现在,我对如何处理符号表示感到困惑。是否可以将符号保持为char something: char sign ?

但是接下来的问题是,当我必须对两个整数进行相加和相乘时该怎么办,当我在这些操作中出现溢出时该怎么办。

所以,如果你们中的一些人对我应该如何表示数字(格式)以及我应该如何进行乘法和加法有一些想法,我将非常感谢。我不需要任何代码,我在学习阶段只需要一些想法。谢谢你。

这样做的一个好方法是将符号存储为bool(例如bool is_neg;)。这样,数据的含义就完全清楚了(反之,如果是char,则不完全清楚)。

你可能想要将每个数字存储在一个unsigned short(或者如果你想要精确的符号,uint16_t)。然后,当你做两个数字的乘法时,你可以把它们乘以unsigned int (uint32_t),然后低16位是你的结果,溢出是在高16位。然后可以很容易地将其添加到结果数组中。你知道一个n位数字乘以一个k位数字最多是n + k位长,所以你可以预先分配你的数组为这个大小,然后担心以后删除多余的零。

希望这对你有帮助,如果你想要更多的技巧,请告诉我。

您必须做出的第一个设计决策是基础的选择。

你似乎倾向于十进制。可以解包(每个数字一个完整字节,数字或ASCII表示),也可以打包数字对(十进制编码二进制,一个字节中有两个4位)。

对于更快的操作,其他方案更方便:基是2的幂或10的幂,适合一个字节,一个short,一个int…

10的幂的好处是可以逐字地进行以10为基数的转换。

加法是一件简单的事情:将单词成对地相加并处理进位。

如果你关心效率,乘法是完全不同的故事。可以使用学校教的书面计算方法,但它需要长度1 ×长度2的运算。对于长数字,更有效的方法是首选(http://en.wikipedia.org/wiki/Multiplication_algorithm#Karatsuba_multiplication)。它们也更复杂。