2009-11-29 4 views
1

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

+3

звучит как домашнее задание – Alon

+1

а также C++ - это оо, одно из требований к домашнему заданию - реализовать его сам, и я должен организовать его таким образом: BigInteger в основном представляет собой вектор указателей BigBit. BigBit должен перегружать стандартные логические операторы на битах, например, &, |, ~ и ^. Поэтому я реализую BigBit как bool ... Теперь вопросы в том, как хранить большие числа в классе BigInteger. Как это работает, если у меня есть такое ограничение? И да, это домашнее задание, я просто пытаюсь найти идеи или идеи о том, как сделать это самым простым способом ... – Alex

ответ

0

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

[EDIT] Пахнет домашней работой. Поэтому, когда у вас есть BigBit класс, то сделать это:

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

а C++ - это оо, одно из требований - реализовать его сам, и я должен его организовать таким образом: BigInteger в основном представляет собой вектор указателей BigBit. BigBit должен перегружать стандартные логические операторы на битах, например, &, |, ~ и ^. Поэтому я реализую BigBit как bool ... Теперь вопросы в том, как хранить большие числа в классе BigInteger. Как это работает, если у меня есть такое ограничение – Alex

+0

, а также если аргумент является int, мы говорим о больших числах здесь .. так что int не будет содержать его ... что, если аргумент является строкой, как вы бы преобразовали строку в биты .... представляя это большое количество – Alex

+0

Посмотрите на исходный код 'atoi()' как преобразовать строку в ее двоичное представление. Это довольно просто. См. Koders.com для примера: http://www.koders.com/c/fid85C526B4C012C3A19A83B32509327C77C9AC5598.aspx?s=atoi.c#L1 –

0

C++ BigInt class
C++ Big Integer Library
написать большую 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; 
} 
1

вопрос, то, кажется, "как я могу превратить целое число в списке битов"? Иными словами, каково базовое представление целого числа?

Поскольку это должно быть домашнее задание, позвольте мне рассказать о проблеме, подумав в базе 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

это работает, если целое число невелико ...что, если целое число велико, такое как 2^10 ... определенно мне нужно сохранить это в переменной сначала, прежде чем преобразовать его в биты ... теперь проблема в том, какая переменная сможет ее сохранить ... string будет делать это, но тогда как мне преобразовать строку в двоичный файл ... – Alex

+0

2^10 на самом деле не такой большой. И алгоритм, на который я намекаю, занимает только одно деление и по модулю на цифру ответа. Он будет работать нормально, если номер, который вы начинаете, подходит для машинного слова (например, unsigned int). И если это не так, что мы пытаемся снова преобразовать? – Managu

Смежные вопросы