Я пытаюсь преобразовать действительно большие числа (> 100 цифр) из строки в целое число в ZN аддитивная группа (по модулю n). n гарантированно находится в стандартном диапазоне C int (скажем, n = 12345).
Ни простой подход atoi затем «%», ни BigIntiger здесь не работают.
Есть идеи, как это реализовать?
Я предполагаю, что вы имели в виду C ++ в своем вопросе (нет такой вещи, как C / C ++). atoi преобразует строку в число, которое может вписаться в стандартное целое число (32 бита), так что это не то, что вам нужно. Вам придется написать свою собственную функцию преобразования.
Для простоты математики, давайте предположим, что ваш номер положительный. Сначала отметим, что сложение и умножение по модулю эквивалентно тому, что без модуля. Таким образом, нам нужно только сохранить результат этих двух операций, модуль n. Затем обратите внимание, что мы можем построить цифру большого числа за цифрой:
unsigned int convert(const char* s, int n) {
long long x = 0;
for (char *p = s; *p; p++) {
x *= 10;
x += (int)(*p - '0');
x %= n;
}
return x;
}
Я упустил любую проверку ошибок для ясности. В качестве упражнения напишите некоторый дополнительный код, чтобы убедиться, что s является допустимой строкой с нулевым символом в конце, представляющей большое целое число без каких-либо пробелов / дополнительного форматирования.
Других решений пока нет …