C/C++ - [решено] HugeInt( int неограниченного размера)

Ответить
Аватара пользователя
котвася

C/C++ - [решено] 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;
}

Можно так же подсказать по коду, для его оптимизации и т.д
Аватара пользователя
AlexTNT

Re: C/C++ - [решено] HugeInt( int неограниченного размера)

Сообщение AlexTNT »

Цитата котвася:



HugeInt n3("99999999999999999999999");
C/C++ - [решено] HugeInt( int неограниченного размера)




Скорее всего число выходит за приделы определённого типа. Можно использовать также тип long long (т.е. int64). Покрайней мере надо попробовать уменьшить кол-во девяток.
Аватара пользователя
котвася

Re: C/C++ - [решено] HugeInt( int неограниченного размера)

Сообщение котвася »

у HugeInt неограниченный размер, хоть 9^1231242345
Аватара пользователя
котвася

Re: C/C++ - [решено] HugeInt( int неограниченного размера)

Сообщение котвася »

как по мне это просто печать символов выходит за границы. Как определить что каретка находится на конце строки и перенести ее на следующую?
Аватара пользователя
ganselo

Re: C/C++ - [решено] HugeInt( int неограниченного размера)

Сообщение ganselo »

Код:

Код: Выделить всё

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 


Цитата котвася:



Так вот хотелось бы узнать с чем это есть надо?
C/C++ - [решено] HugeInt( int неограниченного размера)




Ставьте точки прерывания и смотрите где вылетает.
Аватара пользователя
pva

Re: C/C++ - [решено] HugeInt( int неограниченного размера)

Сообщение pva »

ещё удобно использовать не 10-чную, а 2^16-ричную систему исчисления. Складывать и умножать - так же, столбиком. И влезет больше, и код проще.
Ответить

Вернуться в «Программирование и базы данных»