большие целые числа в с ++ - PullRequest
       11

большие целые числа в с ++

1 голос
/ 29 ноября 2009

Я знаю, что этот вопрос, вероятно, задавался на этом форуме много раз, а также в Интернете. Меня просят создать реализацию большого целого числа в c ++, однако есть ограничение, что один из моих конструкторов должен принимать значение int в качестве аргумента ... поэтому я предполагаю, что будет более одного конструктора не по умолчанию. поэтому мой вопрос, что было бы самым простым способом сделать это ??

Ответы [ 3 ]

1 голос
/ 29 ноября 2009

Тогда возникает вопрос: «Как превратить целое число в список битов»? Другими словами, что такое представление целого числа в base-2?

Поскольку предполагается, что это домашнее задание, позвольте мне обсудить проблему, подумав по основанию 10; соответствующие изменения должны быть очевидны с некоторой мыслью.

Учитывая базовое число 10, довольно легко определить, какая цифра справа: это просто остаток при делении на 10. Например. если n = 1234, то его самая правая цифра равна n% 10 = 4. Чтобы получить следующую самую правую цифру, мы делим на 10 (получая 123) и повторяем процесс. Итак:

1234/10=123; 1234%10 = 4
123/10=12  ; 123%10 = 3
12/10=1    ; 12%10 = 2
1/10=0     ; 1%10 = 1

Итак, теперь мы получили ответы [4,3,2,1]. Если мы поменяем их местами, мы получим 10-значные цифры нашего номера: [1, 2, 3, 4].

0 голосов
/ 29 ноября 2009

C ++ BigInt класс
C ++ Большая целочисленная библиотека
написать большой int например:

typedef struct {
    int high, low;
} BiggerInt;

BiggerInt add( const BiggerInt *lhs, const BiggerInt *rhs ) {
    BiggerInt ret;

    /* Ideally, you'd want a better way to check for overflow conditions */
    if ( rhs->high < INT_MAX - lhs->high ) {
        /* With a variable-length (a real) BigInt, you'd allocate some more room here */
    }

    ret.high = lhs->high + rhs->high;

    if ( rhs->low < INT_MAX - lhs->low ) {
        /* No overflow */
        ret.low = lhs->low + rhs->low;
    }
    else {
        /* Overflow */
        ret.high += 1;
        ret.low = lhs->low - ( INT_MAX - rhs->low ); /* Right? */
    }

    return ret;
}
0 голосов
/ 29 ноября 2009

Зачем изобретать велосипед? Используйте библиотеку GNU MP .

[ПРАВКА] Пахнет домашней работой. Поэтому, когда у вас есть класс BigBit, сделайте следующее:

  1. Очистить все биты
  2. Написать цикл, который проходит по всем битам аргумента int конструктора
  3. Для каждого бита в аргументе int, который равен != 0, установите бит в векторе BigBit.
...