我是编程新手,我必须为整数编写一个抽象数据类型(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
?
但接下来的问题是当我必须添加和乘以两个整数时该怎么做,当我在这个操作上溢出时的情况怎么样。
所以,如果你们中的一些人对我应该如何表示数字(格式)有一些想法,我应该如何进行乘法和加法,我将非常精彩。我不需要任何代码,我在学习阶段只是一些想法。谢谢。
答案 0 :(得分:2)
这样做的一个好方法是将标志存储为bool(例如bool is_neg;
)。这样就完全清楚了数据意味着什么(带有字符的副本,它并不完全清楚。
您可能希望将每个数字存储在unsigned short中(或者如果您想要准确地了解sign,uint16_t)。然后,当你做两位数的乘法时,你可以将它们乘以无符号整数(uint32_t),然后低16位是你的结果,溢出是高16位。然后,您可以非常轻松地将其添加到结果数组中。您知道n位数乘以k位数最多为n + k位长,因此您可以将数组预先分配到该大小,然后担心以后删除多余的零。
希望这会有所帮助,如果您需要更多提示,请与我们联系。
答案 1 :(得分:1)
您必须做出的第一个设计决定是选择基础。
你似乎倾向于纯十进制。可以解压缩(每个数字一个完整字节,数字或ASCII表示),或打包数字对(十进制编码二进制,一个字节中两次四位)。
其他方案对于更快的操作更方便:基于2的幂或10的幂,拟合一个字节,一个短,一个整数......
10的权力具有以下优点:可以逐字地完成与基数10的转换。
添加是一件容易的事:成对添加单词并处理进位。减法相同,借用。
如果你关心效率,乘法是一个完全不同的故事。可以使用在学校教授的书面计算方法,但它需要长度为1 x长度2的操作。对于长数字,首选更有效的方法(http://en.wikipedia.org/wiki/Multiplication_algorithm#Karatsuba_multiplication)。它们也更复杂。