Как хранить хранить значение 10^20 в C?

Я хочу умножить два числа размеров 10^10результирующий размер 10^20 который 2^66,

Я хочу сохранить это число в стандартном типе данных в C. Я бы предпочел не использовать "библиотеку GNU MP Bignum".

Почему следующая программа на C неправильно держит номер?

#include<stdio.h>
typedef long long int ull;
int main(){

    ull n1 = 10000000000LL;
    ull n2 = 10000000000LL;

    printf("%llu",n1*n2);
    return 0;
}

Как лучше всего хранить этот номер и работать с ним?

3 ответа

Решение

Храните его как два long long ценности. Вот эскиз решения:

#include <stdio.h>

typedef unsigned long long ull;

void multiply( ull a, ull b, ull * lo, ull * hi )
{
  ull ah = a >> 32;
  ull bh = b >> 32;
  ull al = a & 0xFFFFFFFF;
  ull bl = b & 0xFFFFFFFF;

  ull mid = ah * bl + al * bh;
  ull albl = al * bl;

  ull imm = mid + ( albl >> 32 );

  *lo = ( mid << 32 ) + albl;
  *hi = ah * bh + ( imm >> 32 );
}

int main()
{
  ull n1 = 10000000000LL;
  ull n2 = 10000000000LL;

  ull lo, hi;

  multiply( n1, n2, &lo, &hi );

  printf( "result in hex is %llx%016llx\n", hi, lo );
  return 0;
}

Выходы:

result in hex is 56bc75e2d63100000

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

Я лично фанат использования связанного списка. Идея состояла бы в том, чтобы хранить каждую цифру в узле. Вам необходимо реализовать функции сложения, вычитания, умножения и деления соответственно.

На 64-битной архитектуре long long держит не более 2^63-1. Максимум 32 бита: 2^32 -1, Если вам нужно большее число, чем это, вам следует пересмотреть то, что вы делаете, если есть лучший способ решить проблему.

Если вам нужны большие числа, вам придется либо создать свою собственную библиотеку, либо использовать чужую библиотеку:

Вот две библиотеки для обработки чисел произвольной точности. Пределы того, насколько большое число вы можете использовать, зависят от объема дискового пространства, памяти и вычислительной мощности, которые вы должны хранить и вычислять.

GMP и MAPM

Если вы должны свернуть свой собственный, вы можете сохранить его в массиве целых чисел. 64-разрядное целое число - это просто два 32-разрядных целых числа. 1024-битное целое число также можно рассматривать как тридцать два 32-битных целых числа. Создайте класс, который содержит массивы целых чисел, соединяя их в любой нужный вам размер. Сложная часть состоит в том, чтобы написать функции, которые могут сложить, умножить и вычесть массивы целых чисел.

Другие вопросы по тегам