2010-12-04 20 views
0

我正在测试BigIntegers。在C中使用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有人知道为什么还是可以看到什么是错我的代码?

我使用的.NET 4.0实现的BigInteger

+0

我不认为编码为UTF8会给你一个代表数字25的字节数组吗? – flq 2010-12-04 23:39:27

+2

十六进制中的6809是0x1A99,正好是0x3532的一半。对于字符串中的字符,ASCII码(UTF-8在ASCII码范围内使用ASCII码)是0x32和0x35,由于little-endian字节顺序而变为0x3532。所以你的“大整数”并不奇怪,除法给你正确的结果。 – 2010-12-04 23:51:40

回答

3

除了别人指出的字符串到BigInteger转换问题之外,划分两个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 + "!"); 
} 
3

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

你可能想使用Parse方法来代替:

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

`BigInteger`是System.Numerics的一部分。Net 4 – Cameron 2010-12-04 23:41:24

1

你过于复杂,你如何构建BigInteger - 从byte框架提供隐式转换,Int16等:

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

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

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

如果必须从一个数字的字符串表示形式转换,使用BigInteger.TryParseBigInteger.Parse

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