Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - [решено] HugeInt( int неограниченного размера)

Ответить
Настройки темы
C/C++ - [решено] HugeInt( int неограниченного размера)

Аватара для котвася

Пользователь


Сообщения: 147
Благодарности: 5

Профиль | Отправить PM | Цитировать


Изменения
Автор: котвася
Дата: 26-04-2012
Создал класс 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
Благодарности: 5

Профиль | Отправить PM | Цитировать


F12 не нажимал вообще

Отправлено: 02:01, 01-08-2010 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Аватара для AlexTNT

Пользователь


Сообщения: 99
Благодарности: 19

Профиль | Отправить PM | Цитировать


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

-------
В споре рождается истина.


Отправлено: 11:21, 01-08-2010 | #3


Аватара для котвася

Пользователь


Сообщения: 147
Благодарности: 5

Профиль | Отправить PM | Цитировать


у HugeInt неограниченный размер, хоть 9^1231242345

Отправлено: 14:46, 01-08-2010 | #4


Аватара для котвася

Пользователь


Сообщения: 147
Благодарности: 5

Профиль | Отправить PM | Цитировать


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

Отправлено: 15:02, 01-08-2010 | #5


Аватара для ganselo

Старожил


Сообщения: 232
Благодарности: 90

Профиль | Сайт | Отправить 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++;
}
проще
Код: Выделить весь код
while(!(temp >=0 && temp <= 9)) { ... }
Цитата котвася:
Так вот хотелось бы узнать с чем это есть надо? »
Ставьте точки прерывания и смотрите где вылетает.

-------
К величайшему сожалению "история учит нас тому, что она ничему не учит".


Последний раз редактировалось ganselo, 01-08-2010 в 23:02.

Это сообщение посчитали полезным следующие участники:

Отправлено: 20:18, 01-08-2010 | #6

pva pva вне форума

Аватара для pva

Ветеран


Сообщения: 1180
Благодарности: 279

Профиль | Отправить PM | Цитировать


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

Отправлено: 20:44, 02-08-2010 | #7



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - [решено] HugeInt( int неограниченного размера)

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
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




 
Переход