17

Есть огромное число в виде текстовой строки, 24 десятичных знака в длину (например, 345678923456789876543234). Это число надо разделить на другое, достаточно малое число (например, 97).

Как выполнить деление, если из-за длины числа недоступен даже long и ulong?

Arhadthedev
  • 11,528
  • Но ведь результат деления например на 97 будет на порядок меньше. Вы беспокоитесь, что не влезут 23 цифры результата, но совершенно не волнуетесь за 24 исходных цифры? – Sergey Oct 15 '16 at 03:07

4 Answers4

21

Воспользуйтесь структурой BigInteger:

Console.WriteLine(BigInteger.Parse("345678923456789876543234") / 97);
// выдаёт 3563700241822576046837

Не забудьте подключить сборку System.Numerics.


Если нужно и частное, и остаток, то делайте так:

BigInteger dividend = BigInteger.Parse("345678923456789876543234");
BigInteger quotient = dividend / 97;
BigInteger remainder = dividend % 97;

(ну или воспользуйтесь BigInteger.DivRem, если хотите). Остаток можно скастить в int, т. к. он помещается туда:

int remainder = (int)(dividend % 97);
VladD
  • 206,799
  • Спасибо большое, но мне надо в форме(WindowsForms) и я пытался привязать к переменной не получается... Туповот-с... – Waldemar Karsten Oct 12 '16 at 12:33
  • @WaldemarKarsten полученный результат приводите к строке и потом уже привязывайте куда вам там нужно на форме. – Alexey Oct 12 '16 at 12:42
  • Я понимаю что выражаюсь как-то сумбурно... Первый раз я задаю вопрос и поэтому надеюсь на снисхождение... есть переменная. В нее надо записать огромное число и потом с ней работать... Число получается путем манипуляций... тексты между собой складываются. 24 числовых знака получается. необходимо эту переменную потом преобразовать в число. Потом надо из этого числа получить модуль 97 (остаток от деления на 97) и записать его в переменную. Вот такая задачка. Если можете помогите. Числа будут конечно потом разные... Поэтому все делается через переменные. Складываются тексты и так далее – Waldemar Karsten Oct 12 '16 at 12:56
  • Ну, задачу преобразования текста в число и проведения операции решает приведённый код. Переменная в которой вы храните модуль должна быть какого-то строго определённого типа? Почему бы вам не сделать её типом BigInteger? Ну или string'ом на худой конец и каждый раз когда возникает необходимость выполнить операцию над числом приводить его в BigInteger? Если вам нужен работающий код решающий вашу проблему-увы, его скорее всего тут не будет. – Alexey Oct 12 '16 at 13:23
  • @WaldemarKarsten: Ну, не выводите на консоль, а запишите в переменную типа BigInteger, проблем быть не должно. – VladD Oct 12 '16 at 13:24
  • @WaldemarKarsten: Дополнил ответ. – VladD Oct 12 '16 at 13:28
  • Большое Вам спасибо. Вы мне очень помогли. Всем Большое спасибо. – Waldemar Karsten Oct 12 '16 at 14:13
  • @WaldemarKarsten: Пожалуйста! – VladD Oct 12 '16 at 14:27
5

Если BigInteger недоступен

Разбейте число на части, например, поделите отдельно "слева направо", добавляя остаток от деления левой части к правой, пока не дойдете до самой "правой", которую поделите обычным способом, и соедините результат в одно число (или строку, если не влезет)

4per
  • 2,696
  • Да, именно так, как в школе учили столбиком делить, так и делите и не нужно будет переживать за переполнение. – Isaev Oct 18 '16 at 18:21
1

Навскидку:

using System.Numerics;
...
//Ваша строка, полученная путем манипуляций.
string yourStringNumber = "345678923456789876543234";
//Преобразуем строку в число. 
BigInteger big = BigInteger.Parse(yourStringNumber); 
//это ваш делитель, равный сейчас 97.
int divider = 97; 
//Получаем остаток от деления на 97.... Ну или что у вас там будет в переменную divider записано.
BigInteger result = big % divider;
//Вывод результата строкой на форму, в контрол label1 или... 
label1.Text = result.ToString(); 
//...Показываем число строкой в отдельном модальном окне. И так далее....
MessageBox.Show(result.ToString());
...
Nicolas Chabanovsky
  • 51,426
  • 87
  • 267
  • 507
BlackWitcher
  • 2,756
0

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

using System;

int rem(String n, int d) { int r = 0; foreach (char c in n) { r = (10 * r + (c - '0')) % d; } return r; }

string[] tokens = Console.ReadLine().Split(); Console.WriteLine(rem(tokens[0], int.Parse(tokens[1])));

$ csc -nologo rem.cs

$ echo 345678923456789876543234 97 | mono rem.exe 45