|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - [решено] HugeInt( int неограниченного размера) |
|
C/C++ - [решено] HugeInt( int неограниченного размера)
|
Пользователь Сообщения: 147 |
Профиль | Отправить PM | Цитировать
Создал класс HugeInt, написал проверку.
При компиляции в конфигурации Debug(с объединением среды) приложение выполняется без ошибок, а при завершении выдает ошибку(прикрепил PrintScreen). А при компиляции Release все без ошибок. Так вот хотелось бы узнать с чем это есть надо? //HUGEINT.H //Определение класса HugeInt #include <iostream> using std::ostream; #ifndef HUGEINT_H #define HUGEINT_H class HugeInt { friend ostream &operator<< (ostream &, HugeInt &); public: HugeInt(long = 0); HugeInt(const char *); HugeInt operator+ (HugeInt &); HugeInt* operator* (HugeInt &); private: short *INTEGER; int SIZE; }; #endif //HUGEINT.CPP //Определение функций элементов класса HugeInt #include <iostream> using std::ostream; #include "HugeInt.h" HugeInt::HugeInt(long val) { SIZE = 0; long temp = val; while((temp != 0) && (temp != 1) && (temp != 2) && (temp != 3) && (temp != 4) &&(temp != 5) && (temp != 6) && (temp != 7) && (temp != 8) && (temp != 9)) { temp /=10; SIZE++; } SIZE++; INTEGER = new short[SIZE]; for(int i = 0; i < SIZE; i++ ) INTEGER[i] = 0; for(int i = SIZE-1; i >=0; i--) { INTEGER[i] = val%10; val /=10; } } HugeInt::HugeInt(const char *string) { SIZE = strlen(string); INTEGER = new short[SIZE]; int i, j; for(int i = 0; i < SIZE; i++ ) INTEGER[i] = 0; for(i = ((SIZE) - strlen(string)), j = 0; i < SIZE; i++, j++) INTEGER[i] = short(string[j] - '0'); } HugeInt HugeInt::operator+ (HugeInt &operand) { HugeInt temp; temp.SIZE = ((SIZE >= operand.SIZE) ? SIZE : operand.SIZE); int carry = 0; int i; bool stop = false; while(stop == false) { for(i = 1; i <= temp.SIZE; i++) { temp.INTEGER[temp.SIZE-i] = ((SIZE-i >= 0) ? INTEGER[SIZE-i] : 0) + ((operand.SIZE-i >= 0) ? operand.INTEGER[operand.SIZE-i] : 0) + carry; if(temp.INTEGER[temp.SIZE-i] > 9) { temp.INTEGER[temp.SIZE-i] %= 10; carry = 1; if((temp.SIZE-i) == 0) { temp.SIZE++; carry = 0; break; } } else { carry = 0; if((temp.SIZE-i) == 0) stop = true; } } } return temp; } /*HugeInt& HugeInt::operator* (HugeInt &operand) { }*/ ostream& operator<< (ostream &out, HugeInt &num) { for(int i = 0; i < num.SIZE; i++) out << num.INTEGER[i]; return out; } //MAIN.CPP //Драйвер класса HugeInt #include <iostream> using std::ostream; using std::cout; using std::cin; using std::endl; #include "HugeInt.h" int main() { setlocale(LC_ALL, ".1251"); cout << "Дравер проверки класса HugeInt" << endl; HugeInt n1(500); HugeInt n2(500); HugeInt n3("99999999999999999999999"); HugeInt n4("1"); HugeInt n5; cout << "n1 равен " << n1 << endl << "n2 равен " << n2 << endl << "n3 равен " << n3 << endl << "n4 равен " << n4 << endl << "n5 равен " << n5 << endl << endl; n5 = n1 + n2; cout << n1 << " + " << n2 << " = " << n5 << endl << endl; n5 = n3 + n4; cout << n3 << " + " << n4 << " = " << n5 << endl << endl; n5 = n2 + HugeInt("1000000"); cout << n2 << " + " << "1000000" << " = " << n5 << endl; system("pause"); return 0; } |
|
Отправлено: 01:59, 01-08-2010 |
Пользователь Сообщения: 147
|
Профиль | Отправить PM | Цитировать F12 не нажимал вообще
|
Отправлено: 02:01, 01-08-2010 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Пользователь Сообщения: 99
|
Профиль | Отправить PM | Цитировать Цитата котвася:
|
|
------- Отправлено: 11:21, 01-08-2010 | #3 |
Пользователь Сообщения: 147
|
Профиль | Отправить PM | Цитировать у HugeInt неограниченный размер, хоть 9^1231242345
|
Отправлено: 14:46, 01-08-2010 | #4 |
Пользователь Сообщения: 147
|
Профиль | Отправить PM | Цитировать как по мне это просто печать символов выходит за границы. Как определить что каретка находится на конце строки и перенести ее на следующую?
|
|
Отправлено: 15:02, 01-08-2010 | #5 |
Старожил Сообщения: 232
|
Профиль | Сайт | Отправить PM | Цитировать while((temp != 0) && (temp != 1) && (temp != 2) && (temp != 3) && (temp != 4) &&(temp != 5) && (temp != 6) && (temp != 7) && (temp != 8) && (temp != 9)) { temp /=10; SIZE++; } Цитата котвася:
|
|
------- Последний раз редактировалось ganselo, 01-08-2010 в 23:02. Отправлено: 20:18, 01-08-2010 | #6 |
Ветеран Сообщения: 1180
|
Профиль | Отправить PM | Цитировать ещё удобно использовать не 10-чную, а 2^16-ричную систему исчисления. Складывать и умножать - так же, столбиком. И влезет больше, и код проще.
|
Отправлено: 20:44, 02-08-2010 | #7 |
Участник сейчас на форуме | Участник вне форума | Автор темы | Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
C/C++ - [решено] невозможно преобразовать 'int (__cdecl *)(void)' в 'int' | котвася | Программирование и базы данных | 4 | 21-06-2010 18:14 | |
C/C++ - [решено] int в AnsiString | crashtuak | Программирование и базы данных | 7 | 30-03-2009 02:11 | |
Изменение размера компанентов синхронно, с изменением размера формы | Morbid GOD | Программирование и базы данных | 1 | 10-11-2004 02:31 | |
modem motorola sm56 int | Guest | Железо в Linux | 7 | 02-10-2004 03:38 | |
Как перевсти char в int? | Sage | Программирование и базы данных | 4 | 27-03-2003 09:44 |
|