Новый DataType, который может иметь количество до 100 цифр -- c++ пол Связанный проблема

New datatype which can have numbers upto 100 digits


2
vote

проблема

русский

Примечание. Это был вопрос интервью и может не иметь фактического случая использования в настоящее время

Вопрос должен был разработать класс, который может хранить номера, которые очень очень большой, скажем, каждый номер может иметь 100 цифр. Этот новый класс - это тип данных, как INT.

Каковы различные типы конструкторов, перегрузок и другие функции, которые вы бы написали.

Как это может быть дополнительно расширено для поддержки действительно больших номеров плавающих точек.

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

Мой ответ состоял из 2 подходов 1. Использование массива целых чисел для хранения каждого скажем, 10 цифр 2. Использование самой строки для хранения номера и выполнения операций на отдельных номерах.

Что будет лучшим подходом?

Английский оригинал

Note: This was an interview question and may not have an actual use case currently

The question was to design a class that can store numbers which are very very large say each number can have 100 digits. This new class is a datatype like int.

What are the different types of constructors, overloads and other functions that you would write.

How can this be further extended to support really large floating point numbers.

How this can be given to others so that they can reuse the same component with their own additional functionality.

My answer consisted of 2 approaches 1. using array of integers to store every say 10 digits 2. using string itself to store the number and perform operations on individual numbers.

What would be the best approach?

</div
  
     
     

Список ответов

4
 
vote
vote
Лучший ответ
 

Лучший подход будет предлагать, что они используют IM существующие, пробованные и проверенные C ++ обертку для библиотеки Bignum, как GMP .

 

The best approach would be to propose they use am existing, tried and tested C++ wrapper for a bignum library like GMP.

</div
 
 
       
       
8
 
vote

Приятный вопрос :)

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

Каковы различные типы Конструкторы, перегрузки и другие Функции, которые вы бы написали.

Вам нужен набор конструкторов, таких как единый элемент по умолчанию, Copy Constructor, Construction из собственных целочисленных типов. Последняя часть - это сложная часть, фактически в C ++, смешивание подписанного / арифметика без знака в C ++ не так просто, как выглядит так. Вы можете извлечь выгоду из этого видео у создателей safeint (используется Microsoft) . Кроме того, вам может потребоваться построить свой Bignum из Raw Memory (Byte-Block). Разрушетель будет необходим, если ваш Bignum является динамичным, в противном случае он тривиален для реализации.

Входные / OUPUT Стандартные установки являются обязательными для такой библиотеки, чтобы облегчить его использование. Предоставление способа принять числа в популярных базах, а также плюс. Для операций ваш тип должен вести себя как простой родной тип. Это означает, что вам нужно перегружать практически все операторы, которые вы можете перегрузить:

 <код> Arithmetic operators Comparison operators/Relational operators Logical operators Bitwise operators Compound-assignment operators etc..   

Содержание библиотеки - это открытый вопрос.

Самое главное, что нужно помнить, заключается в том, что C ++ имеет некоторые из их мышечных правил, касающиеся преобразования между подписанными и неподписанными номерами. Уход должен быть взят!

Как это может быть дополнительно продлено до поддержка действительно большая плавающая точка числа.

Большие поплавки не так просто. По сути, вы выбираете Radix, с которым вы хотите работать. Представление номера с научной точки зрения означает иметь базовые и экспонентные части. Которые на самом деле являются целыми числами.

Как это может быть дано другим так что они могут повторно использовать тот же компонент со своими дополнительными Функциональность.

Постарайтесь сделать его не навязчивым. I. Когда я беру <код> int off, и поместите вместо него my_bigint, то он должен работать ! <Код> typedef Подчка должна быть достаточно, чтобы переключаться между вашим типом и собственными типами. Пусть другие пишут функции сверху типа, сделайте его черным ящиком. Я предпочитаю заголовки при использовании библиотек, поэтому я бы написал только заголовок библиотеки.

Мой ответ состоял из 2 подходов 1. используя массив целых чисел, чтобы хранить каждый Скажите 10 цифр 2. Использование самой строки хранить номер и выполнить Операции на отдельных номерах.

Строки на самом деле не подходят. Что вам нужно, это выбрать базу 2 ** N как ваша база в большинстве случаев. Есть библиотеки, которые используют другие основания, но это не хорошая идея, на мой взгляд, Mapm является одним из них.

 

Nice question :)

First of all, using a string representation is just not professional. You can do the mathematical operations at the level the word of the machine instead much more efficiently. Especially if you are going to use base 2.

What are the different types of constructors, overloads and other functions that you would write.

You need a set of constructors like a default one, copy constructor, construction from native integer types. The last part is the tricky part actually in C++, mixing signed/unsigned arithmetic in C++ is not so-simple as it looks like. You can benefit from this video by the creators of safeint(used by Microsoft). Also, you could need to construct your bignum from raw memory(byte-block). A destructor would be needed if your bignum is dynamic, otherwise it is trivial to implement.

Input/Ouput standard facilities are a must for such a library to ease using it. Providing a way to accept numbers in popular bases is a plus also. For the operations, your type should behave just like simple native type. This means you need to overload almost all the operators that you could overload:

Arithmetic operators Comparison operators/Relational operators Logical operators Bitwise operators Compound-assignment operators etc.. 

The content of the library is an open-ended question.

The most important thing to remember is that C++ has some weired rules concerning the conversion between signed and unsigned numbers. Care must taken!

How can this be further extended to support really large floating point numbers.

big floats are not that easy. Basically, you choose the radix you want to work with. Representing the number scientifically means having base and exponent parts. Which are integers in fact.

How this can be given to others so that they can reuse the same component with their own additional functionality.

Try to make it non-intrusive. i.e. when I take int off, and put instead of it my_bigint, then it should work! typedeffing should be just enough to switch between your type and native types. Let others write functions on top of the type, make it a black box. I prefer headers when using libraries, so I would write the library header-only.

My answer consisted of 2 approaches 1. using array of integers to store every say 10 digits 2. using string itself to store the number and perform operations on individual numbers.

Strings are not really suitable. What you need is to choose base 2**n as your base in most cases. There are libraries which use other bases, but it is not a good idea in my opinion, MAPM is one of those.

</div
 
 
 
 
3
 
vote

См. Статью в Википедии о произвольная прецизионная арифметика .

 

See Wikipedia article about Arbitrary-precision arithmetic.

</div
 
 
0
 
vote

Я сам реализовал класс Bigint для решения проблемы кодового джема. Я использовал unsigned Array для хранения значений, но вам нужно поддерживать количество цифр отдельно. Я реализовал его на основе необходимости,

 <код> #define BIG_INT_SIZE 100  class BigInt {     friend ostream& operator<< (ostream& out, const BigInt& arg);     friend istream& operator>> (istream& inp,       BigInt& arg);      private:             unsigned num[BIG_INT_SIZE+1];             unsigned digits;             bool     sign; // true for -ve      public:             BigInt(const char* = NULL) throw();             BigInt(const BigInt&) throw();             ~BigInt() throw();              // ASSIGNMENT OPERATORS             BigInt& operator=  (const BigInt& arg) throw();             BigInt& operator=  (const    int& arg) throw();             BigInt& operator=  (const   char* arg) throw();              // ARITHMETIC OPERATORS             BigInt  operator+  (const BigInt& arg) throw();             BigInt  operator+= (const BigInt& arg) throw();             BigInt  operator+  (const    int& arg) throw();             BigInt  operator+= (const    int& arg) throw();              BigInt  operator-  (const BigInt& arg) throw();             BigInt  operator-= (const BigInt& arg) throw();             BigInt  operator-  (const    int& arg) throw();             BigInt  operator-= (const    int& arg) throw();              BigInt  operator*  (const BigInt& arg) throw();             BigInt  operator*= (const BigInt& arg) throw();             BigInt  operator*  (const    int& arg) throw();             BigInt  operator*= (const    int& arg) throw();              BigInt  operator/  (const BigInt& arg) throw();             BigInt  operator/= (const BigInt& arg) throw();             BigInt  operator/  (const    int& arg) throw();             BigInt  operator/= (const    int& arg) throw();              BigInt  operator%  (const BigInt& arg) throw();             BigInt  operator%= (const BigInt& arg) throw();             BigInt  operator%  (const    int& arg) throw();             BigInt  operator%= (const    int& arg) throw();              // UNARY OPERATORS             void operator++ ()    throw();             void operator++ (int) throw();             void operator-- ()    throw();             void operator-- (int) throw();              // COMPARISON OPERATORS             bool   operator>  (const BigInt& arg) throw();             bool   operator>= (const BigInt& arg) throw();             bool   operator<  (const BigInt& arg) throw();             bool   operator<= (const BigInt& arg) throw();             bool   operator== (const BigInt& arg) throw();             bool   operator!= (const BigInt& arg) throw();              // DISPLAY & ORDERING             void big_int_order() throw();             void big_int_print() throw(); };   

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

 

I myself implemented a bigint class for solving a code-jam problem. I used unsigned array to store the values but you need to maintain the number of digits separately. I implemented it based on the need,

#define BIG_INT_SIZE 100  class BigInt {     friend ostream& operator<< (ostream& out, const BigInt& arg);     friend istream& operator>> (istream& inp,       BigInt& arg);      private:             unsigned num[BIG_INT_SIZE+1];             unsigned digits;             bool     sign; // true for -ve      public:             BigInt(const char* = NULL) throw();             BigInt(const BigInt&) throw();             ~BigInt() throw();              // ASSIGNMENT OPERATORS             BigInt& operator=  (const BigInt& arg) throw();             BigInt& operator=  (const    int& arg) throw();             BigInt& operator=  (const   char* arg) throw();              // ARITHMETIC OPERATORS             BigInt  operator+  (const BigInt& arg) throw();             BigInt  operator+= (const BigInt& arg) throw();             BigInt  operator+  (const    int& arg) throw();             BigInt  operator+= (const    int& arg) throw();              BigInt  operator-  (const BigInt& arg) throw();             BigInt  operator-= (const BigInt& arg) throw();             BigInt  operator-  (const    int& arg) throw();             BigInt  operator-= (const    int& arg) throw();              BigInt  operator*  (const BigInt& arg) throw();             BigInt  operator*= (const BigInt& arg) throw();             BigInt  operator*  (const    int& arg) throw();             BigInt  operator*= (const    int& arg) throw();              BigInt  operator/  (const BigInt& arg) throw();             BigInt  operator/= (const BigInt& arg) throw();             BigInt  operator/  (const    int& arg) throw();             BigInt  operator/= (const    int& arg) throw();              BigInt  operator%  (const BigInt& arg) throw();             BigInt  operator%= (const BigInt& arg) throw();             BigInt  operator%  (const    int& arg) throw();             BigInt  operator%= (const    int& arg) throw();              // UNARY OPERATORS             void operator++ ()    throw();             void operator++ (int) throw();             void operator-- ()    throw();             void operator-- (int) throw();              // COMPARISON OPERATORS             bool   operator>  (const BigInt& arg) throw();             bool   operator>= (const BigInt& arg) throw();             bool   operator<  (const BigInt& arg) throw();             bool   operator<= (const BigInt& arg) throw();             bool   operator== (const BigInt& arg) throw();             bool   operator!= (const BigInt& arg) throw();              // DISPLAY & ORDERING             void big_int_order() throw();             void big_int_print() throw(); }; 

Hope this might be helpful. I will post the complete implementation in my blog. I will update as i am done.

</div
 
 

Связанный проблема

1  Использование Typedefs соответствующим образом, чтобы избежать «загрязнения Typedef»  ( Using typedefs appropriately to avoid typedef contamination ) 
Я разрабатываю определенные функции для более широкого включения в охватывающем проекте и «особенности», над которыми я работаю, являются некоторые классы, со...

1  C ++ - утечка памяти, вызванная использованием размещения New Over * этот указатель?  ( C memory leak caused by using placement new over this pointer ) 
Как известно, размещение New просто строит объект без выделения любой памяти. Также все члены в классе <Код> 5.5.10 являются объектами вместо указателей, хот...

2  ODBC и NLS_LANG  ( Odbc and nls lang ) 
Допустим, я создал две разные исполняемые файлы программы, например, в C ++. По какой-то причине две программы внутреннее представление текста отличаются др...

0  Проблемы с повышением :: ptr_vector и Boost :: любой  ( Problems with boostptr vector and boostany ) 
Хорошо, так что я сомневался, я хочу знать, если это возможно: Я использую базу данных, с общими данными (строки, ints, bools и т. Д.). Всякий раз, когда об...

0  QNATYIMAGE: невозможно прикрепить к общему сегменту памяти  ( Qnativeimage unable to attach to shared memory segment ) 
Я видел, что есть один та же тема: Ошибка OPENCV в оконечной оболочке для IMREAD: QNATYIMAGE: Невозможно прикрепить к общему сегменту памяти Этот нить был о...

1  Установка значения строки и строки  ( Setting value of string to string ) 
У меня есть строка и AMP; Параметр, и я хочу назначить его строковым параметром. Как это можно сделать. ...

2  Замена DLL со статической библиотекой  ( Replacing a dll with the static library ) 
Ударная точка: У меня есть код C ++, который ссылается на стороннюю статическую библиотеку, которая ссылается на WS2_32.Lib. <Сильная> Цель: Я изучаю спо...

1  STD :: CIN непосредственно к функции  ( Stdcin directly to a function ) 
Недавно я наткнулся на следующую часть кода. Я не знаю, имеет ли это какой-либо смысл, я просто пытаюсь его понять: <код> object Gender extends Enumeration ...

0  Как получить несколько наборов результатов с Poco :: Data?  ( How to fetch multiple result sets with pocodata ) 
Я прочитал Poco :: Руководство пользователя данных и упоминается, что Библиотека имеет поддержку нескольких наборов результатов. Существует пример для этой ...

23  Почему я не могу открыть видео AVI в OpenCV?  ( Why cant i open avi video in opencv ) 
Я только что написал простой пример чтения видео с OpenCv2.3.1, но кажется, что я не могу открыть видео AVI в любом случае: ( <Код> VideoCapture capture("gui...

1  Opencv Изображение Цветовое пространство Преобразование с использованием CVTColor  ( Opencv image color space transformation using cvtcolor ) 
Я использую ниже OpenCV API для преобразования цветового пространства: <код> cvtColor(<input mat>, <output mat>, COLOR_RGB2RGBA); Однако выходное изобра...

6  Теоретически, находит_енди параллельно?  ( In theory is find end parallelizable ) 
В настоящее время я работаю над open -Под предложению Для достижения параллельной функциональности проекту я работаю, но я столкнулся с дорожным блоком с f...

-1  Мусор с указателями в классе, C ++  ( Garbage with pointers in a class c ) 
Я использую Borland Builder C ++. У меня есть утечка памяти, и я знаю, что это должно быть из-за этого класса, который я создал, но я не уверен, как это испра...

4  Преобразовать фильм в Openni * .oni видео  ( Convert movie to openni oni video ) 
the библиотека Kinect Openni использует пользовательский формат видеофайла для хранения видеороликов, которые содержат информацию RGB + D. Эти видео имеют р...

7  GLREADPIXELS () Устанавливает ошибку GL_inValid_Operation  ( Glreadpixels sets gl invalid operation error ) 
Я пытаюсь реализовать цвет выбора с FBO. У меня есть многосмысленные FBO (FBO [0]), которые я использую для визуализации сцены, и у меня нет многоспущенных FB...




© 2021 www.qaru.top All Rights Reserved. Q&A House все права защищены


Licensed under cc by-sa 3.0 with attribution required.