Самый большой гарантированный тип данных C - это uint64_t (см. Stdint.h), который поддерживает до 2 ^ 64 - 1. Я думаю, что предпочтительно поддерживать соответствие стандарту C, когда это возможно, поэтому я ' Я бы предложил сначала упростить проблему, чтобы не использовать типы данных шире. Для этого давайте заимствуем из модульного арифметического c доказательства:
xy % z == ((x % z) * (y % z)) % z
Из этого мы можем сделать вывод, что (12 * 10^22) % 89 == (12 % 89 * 10^11 % 89 * 10^11 %89) % 89
Эта новая версия определенно не так хороша, но все факторы хорошо вписываются в стандартные типы данных C. Упрощение перед вычислением, таким как это, может использоваться для всех данных в вашем диапазоне.
Однако существует проблема с сохранением значения, которое вы хотите по модулю в первую очередь. Разъяснение того, что такое вариант использования, может дать более подходящий ответ. Например, хранится ли значение в строке, возможно, из пользовательского ввода?
В качестве альтернативы, вы можете использовать определенные библиотеки, предназначенные для работы с действительно большими числами. Я не знаю, какой из них лучше всего подходит для ваших целей (я даже не знаю, на какой ОС вы работаете), но если вы хотите изучить эти варианты, просто поищите в Интернете «bignum», «произвольно ... библиотеки "precision" или "бесконечной точности" должны дать вам то, что вы хотите.