Работа с BigIntegers в C # - PullRequest
       35

Работа с BigIntegers в C #

0 голосов
/ 05 декабря 2010

Я тестирую BigIntegers.

Когда я беру большое нечетное число и делю его на 2, я получаю целое число как ответчик, без каких-либо указаний на то, что оно не может точно разделить число.

Итак, первый вопрос: как мне узнать, что два числа делятся точно.

Затем я проверил это с небольшим числом, этот код:

        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 ]

3 голосов
/ 05 декабря 2010

Помимо проблем преобразования строки в 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 голосов
/ 05 декабря 2010

Я не знаю, какую реализацию BigInteger вы используете, но myNumberAsByteArray не будет содержать байтов, представляющих число 25. Вы просто конвертируете строку в байты здесь. Вы могли бы использовать строку myNumberAsString = "abc";, которая дала бы вам другой результат.

Вы, вероятно, хотите использовать метод Parse вместо:

BigInteger myNumber = BigInteger.Parse("25");
2 голосов
/ 05 декабря 2010

Если вам необходимо преобразовать строковое представление числа, используйте BigInteger.TryParse или BigInteger.Parse.

Но независимо от того, как вы создаете экземпляр своего BigInteger, вы можете определить, делится ли число на другое, используя модульную математику.Например, если вы хотите увидеть, делится ли someNumber на 2, просто проверьте, что (someNumber % 2) == 0 (т. Е. SumNumber / 2 имеет остаток от нуля).Это работает для любого целого знаменателя.Просто замените 2 тем знаменателем, который вы хотите проверить.Однако при использовании BigInteger вам, вероятно, следует использовать метод DivRem вместо оператора%.

1 голос
/ 05 декабря 2010

Вы слишком усложняете способ построения BigInteger - платформа предоставляет неявные приведения из byte, Int16 и т. Д.:

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

Чтобы преобразовать большие числа из строкового представления, используйтеBigInteger.Parse():

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