![Компьютерный форум OSzone.net](images/oszone.net.print.gif) |
|
HugeInt( int неограниченного размера)
Создал класс 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;
}
Можно так же подсказать по коду, для его оптимизации и т.д
|
Цитата:
Цитата котвася
HugeInt n3("99999999999999999999999"); »
|
Скорее всего число выходит за приделы определённого типа. Можно использовать также тип long long (т.е. int64). Покрайней мере надо попробовать уменьшить кол-во девяток.
|
у HugeInt неограниченный размер, хоть 9^1231242345
|
как по мне это просто печать символов выходит за границы. Как определить что каретка находится на конце строки и перенести ее на следующую?
|
Код:
while((temp != 0) && (temp != 1) && (temp != 2) && (temp != 3) && (temp != 4)
&&(temp != 5) && (temp != 6) && (temp != 7) && (temp != 8) && (temp != 9))
{
temp /=10;
SIZE++;
}
проще
Код:
while(!(temp >=0 && temp <= 9)) { ... }
Цитата:
Цитата котвася
Так вот хотелось бы узнать с чем это есть надо? »
|
Ставьте точки прерывания и смотрите где вылетает.
|
ещё удобно использовать не 10-чную, а 2^16-ричную систему исчисления. Складывать и умножать - так же, столбиком. И влезет больше, и код проще.
|
Время: 18:04.
© OSzone.net 2001-