我正在编写类似于mpz(C)或BigInteger(Java)的类。这只是为了好玩,所以请不要继续谈论我不应该如何写自己的。
我的课程类似于:
public class HugeInt
{
public List<Integer> digits;
public HugeInt(String value)
{
// convert string value into its seperate digits.
// store them in instance variable above
}
}
现在,执行此类的add()和subtract()方法非常简单。这是一个例子:
private List<Integer> add(List<Integer> a, List<Integer> b)
{
List<Integer> smallerDigits = (compareDigits(a,b) < 0) ? a : b;
List<Integer> largerDigits = (compareDigits(a,b) >= 0) ? a : b;
List<Integer> result = new ArrayList<Integer>();
int carry = 0;
for(int i = 0; i < largerDigits.size(); i++)
{
int num1 = largerDigits.get(i);
int num2 = (i < smallerDigits.size()) ? smallerDigits.get(i) : 0;
result.add((num1 + num2 + carry) % 10);
carry = ((num1 + num2 + carry) / 10);
}
if (carry != 0) result.add(carry);
return result;
}
同样,做倍增也不是那么难。
我在维基百科上看到Division Algorithms上有一个页面,但我不确定哪一个适合我正在尝试做的事情。
因为这些正整数(表示为数字)可以任意长,所以我想确保我不会尝试对除数字以外的任何操作进行任何操作。
但是,有人能指出我正确的方向来划分两个代表List
的数字吗?另外,我可以忽略余数,因为这是整数除法。<Integer
>
答案 0 :(得分:5)
你可以做long division,但这肯定不是最好的方法(编辑:虽然看起来像这样的东西是一个很好的方法) 。您可以查看other implementations大整数库,并且Googling会发现一些有用的信息。
答案 1 :(得分:2)
这可能是一种轻微的矫枉过正,但如果这是你为了好玩而做的事情,你会喜欢阅读: http://www.fizyka.umk.pl/nrbook/c20-6.pdf (这是“C中数值配方”中的“任意精度算术”)。 非常有趣,正如本书的大部分内容一样,有很好的解释和很多代码。
答案 2 :(得分:0)
因为我假设你只是处理整数除法,所以不是很难。乘法是重复加法,除法是相反的 - 重复减法。那么你要做的就是检查你可以从被除数中减去除数的次数。例如,3可以从10减去3次而不会<0,因此整数除法商为3.
答案 3 :(得分:0)
本文A Larger Integer没有说明如何为“较大的整数”实现逐位运算,但它确实展示了如何根据两种Int64类型实现一个(显然是完全正常的)128位整数。我想,扩展使用Int64类型数组的方法来产生一个任意长度的整数并不太难。我只花了几分钟回顾一下这篇文章,并且乘法的实现看起来很可能涉及任意长度。
本文介绍了如何使用binary division实现除法(商和余数)。