我正在编写一个简单的大整数库来进行练习。我想在RSA的简单实现中使用它。我已经阅读了所有以前的帖子,但我没有找到我的问题的答案。我只是在项目的开头,我已经阅读了最好的选择来表示大整数的所有数字应该用无符号长数字来表示它们,所以它应该是这样的:
class BigInteger
{
public:
BigInteger(const std::string &digits);
private:
std::vector <unsigned long> _digits;
};
问题是我不知道如何实现类的构造函数。我想我应该转换字符串的每个字符并将其保存在数组中,以最小化数组使用的总内存,因为每个字符长1个字节而无符号长字长至少4个字节。我应该一次推送一组4个字符以避免浪费每个无符号长数字内存吗?你能给我一个例子或一些建议吗?
谢谢。
答案 0 :(得分:3)
在考虑如何推送数字之前,请考虑如何实现 四个基本操作。你想在构造函数中做什么 string是将字符串转换为内部表示,无论如何 也就是说,要做到这一点,你必须能够乘以10(假设 十进制)并添加。
答案 1 :(得分:0)
正如@James Kanze正确指出的那样,与字符串之间的转换不是主要的设计问题,你应该将它们留到最后。如果您专注于简化与外界的界面,您最终可能会得到一个易于序列化的设计,但却是一个噩梦。
关于手头的特定问题,有效处理bignumber的常用方法是使用每个存储单元中的一半位(如果unsigned long
为32位,则仅使用低16位)。在所有单元中具有备用空间允许您在每个元素中分开操作而不必处理溢出,然后通过移动进位(高位数)来normalize
结果。一个简化的pseuso代码求和方法(忽略大小,主要是其他所有东西:
bignumber& bignumber::operator+=( bignumber const & rhs ) {
// ensure that there is enough space
for ( int i = 0; i < size(); ++i ) {
data[ i ] += rhs.data[ i ]; // might break invariant but won't overflow
}
normalize(); // fix the invariant
}
// Common idiom: implement operator+ in terms of operator+= on the first argument
// (copied by value)
bignumber operator+( bignumber lhs, bignumber const & rhs ) {
lhs += rhs;
return lhs;
}