我对编程很陌生,我必须为整数做一个抽象数据类型(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)。它们也更复杂。