Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   [решено] HugeInt( int неограниченного размера) (http://forum.oszone.net/showthread.php?t=181874)

котвася 01-08-2010 01:59 1464371

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;
}

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

котвася 01-08-2010 02:01 1464373

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

AlexTNT 01-08-2010 11:21 1464453

Цитата:

Цитата котвася
HugeInt n3("99999999999999999999999"); »

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

котвася 01-08-2010 14:46 1464588

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

котвася 01-08-2010 15:02 1464596

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

ganselo 01-08-2010 20:18 1464747

Код:

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)) { ... }
Цитата:

Цитата котвася
Так вот хотелось бы узнать с чем это есть надо? »

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

pva 02-08-2010 20:44 1465513

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


Время: 18:04.

Время: 18:04.
© OSzone.net 2001-