2013-02-17 3 views
1

Как я могу умножить два 64-значных десятичных числа на C# без переполнения?Умножение двух 64-значных чисел

+0

Я не думаю, что вы можете хранить 64-разрядное число в любом современном процессоре с полной точностью, если вы имеете в виду десятичные цифры, а не двоичные цифры или что-то еще. Если у вас было ДВА 64-разрядных чисел (если начинать с ненулевого), тогда результат будет составлять около 128 цифр (10^64 * 10^64 = 10^128). Уч. – Joe

+1

Вы действительно должны предоставить больше информации, чем это. Являются ли они целыми числами? Это очень важно. Цифры в какой базе? Binary? Десятичная дробь? Возможно, шестнадцатеричный? Это важно. – harold

+0

Извините за недостающую информацию ... Оба носа. являются десятичными знаками – Bright

ответ

3

Если вам нужно 64 десятичных значных чисел, и если они являются целыми числами, вы можете использовать System.Numerics.BigInteger-структуру (необходима ссылка на System.Numerics.dll сборки).

BigInteger firstNumber = BigInteger.Parse("63518439492097324687235465876298368764576527346564625480"); 
BigInteger secondNumber = BigInteger.Parse("84890247648975285765484902890273086475254764765147643611"); 
BigInteger product = firstNumber * secondNumber; 
+0

Ницца. Класс, который, как я предполагаю, реализует то, что я собираюсь предложить (разбивая номер на управляемые числа и делая умножение по частям) – Joe

+1

@Joe Да, это как бы разбивает его на 8-битные числа без знака. Они хранятся в массиве типа 'byte []'. Я не знаю, сколько процессорных умножений требуется для заданного размера «BigInteger» (возможно, это зависит от режима компиляции и решений, выполняемых средой выполнения на основе реального оборудования). –

0

Вы всегда можете использовать decimal, чтобы сохранить результат умножения двух чисел long.

long bigNumber = 12345678L; 
long anotherBigNumber = 23456789L; 
decimal result = bigNumber * anotherBigNumber; 
+1

Умножение выполняется с помощью 'long' в вашем примере. Даже если вы перейдете к «десятичной» до того, как будете умножаться, может быть недостаточно «пробела». Попробуйте умножить '1000000000000000L' (пятнадцать нулей) с числом одного и того же размера. Результат будет «обертываться», если вы используете умножение 'long', и оно будет генерировать исключение, если вы используете умножение« decimal ». –

+0

Он не говорит цифры типа 'long'. Он попросил умножить 64 цифры. –

0

Я думаю, что вы можете сделать расчет любого количества (до тех пор, как вы хотите) IF первое, что число конвертирования в строку (так две отдельных строки), чем получить последний номер (символ) и умножить его с каждым номером от другого персонажа (так же, как вы учились в школе) и т. д., и вы добавляете к нему окончательный номер счета (также как строку). Я знаю, что это может быть сделано, и это будет очень сложная логика в начале, но как только вы создадите эту функцию, вы можете умножить любое число, которое вы хотите :)

0

Если они являются целыми числами, используйте класс BigInteger в System.Numerics (Reference System.Numerics.dll!)

Если нет, в Codeplex есть класс BigRational. Он должен был быть в System.Numerics, но его ударили ногами. Link: http://bcl.codeplex.com/releases/view/42782

Смежные вопросы