在C#中使用BigIntegers

时间:2010-12-04 23:36:05

标签: c# .net-4.0 biginteger

我正在测试BigIntegers。

当我取一个大的奇数并将其除以2时,我得到一个整数作为anwser,没有任何迹象表明它不能完全分割数字。

所以第一个问题是我怎么知道两个数字完全不同。

然后我用一个小数字测试了它,这个代码:

        string myNumberAsString = "25";
        System.Text.UTF8Encoding  encoding=new System.Text.UTF8Encoding();
        byte[] myNumberAsByteArray = encoding.GetBytes(myNumberAsString);
        BigInteger myNumber = new BigInteger(myNumberAsByteArray);
        Console.WriteLine(myNumber / 2);

给出结果6809.任何人都知道为什么或者可以看到我的代码有什么问题?

我正在使用BigInteger的.net 4.0实现

4 个答案:

答案 0 :(得分:3)

我不知道您正在使用的BigInteger的实现方式,但myNumberAsByteArray将不包含代表数字25的字节。您只是在这里将字符串转换为字节。你可以使用字符串myNumberAsString = "abc";,它会给你另一个结果。

您可能希望改为使用Parse方法:

BigInteger myNumber = BigInteger.Parse("25");

答案 1 :(得分:3)

除了其他人指出的字符串到大字符转换问题之外,划分两个BigInteger总是产生一个BigInteger结果(因为整数没有小数部分)。这个结果将是浮点结果的整数部分。

要确定除法是否准确,请使用DivRem()方法:

var dividend = BigInteger.Parse("25");

BigInteger remainder;
var quotient = BigInteger.DivRem(dividend, 2, out remainder);
if (!remainder.IsZero) {
    throw new Exception("Division resulted in remainder of " + remainder + "!");
}

答案 2 :(得分:2)

如果您必须从数字的字符串表示转换,请使用BigInteger.TryParseBigInteger.Parse

但无论您如何实例化BigInteger,您都可以通过使用模块化数学来确定数字是否可以被另一个数字整除。例如,如果您想查看someNumber是否可以被2整除,那么只需验证(someNumber % 2) == 0(即sumNumber / 2的余数为零)。这适用于任何整数分母。只需将2替换为您要测试的分母。但是,对于BigInteger,您应该使用DivRem方法而不是%运算符。

答案 3 :(得分:1)

你构建BigInteger的方式过于复杂 - 框架提供了来自byteInt16等的隐式强制转换:

BigInteger myNumber = 25;
Console.WriteLine(myNumber / 2);

要从字符串表示转换较大的数字,请使用BigInteger.Parse()

BigInteger myNumber = BigInteger.Parse("252525252525252525252525252525");
Console.WriteLine(myNumber / 2);