大数四则运算

大数四则运算用C++来实现,一般就可以看出一个人的编程能力了,以下是我实现的大数四则运算,还没写完,只是写了个大概思路,如下:

主文件:

#include "Arithmetic.h"
using namespace std;

int main(int argc, char *argv[])
{
    CArithmetic Arith1;
    CArithmetic Arith2;
    cout << "please input data1: ";
    cin >> Arith1;
    cout << "please input data2: ";
    cin >> Arith2;
//    CArithmetic Arith =  Arith1 + Arith2;
//    cout << Arith << endl;
    CArithmetic Arith = Arith1 * Arith2;
    cout << Arith << endl;
    return 0;
}


实现头文件

#include <vector>
#include <iostream>
using namespace std;

class CArithmetic
{
public:
    CArithmetic();
    ~CArithmetic();

public:
    int size() const { return m_vecData.size(); }

public:
    friend ostream& operator << (ostream &os, const CArithmetic &data);
    friend istream& operator >> (istream &is, CArithmetic &data);

public:
    char operator [] (int nIndex) const;
    CArithmetic operator + (const CArithmetic &data);
    CArithmetic operator - (CArithmetic &data);
    CArithmetic operator * (const CArithmetic &data);
    CArithmetic& operator = (const CArithmetic &data);

private:
    vector<char> m_vecData;
};


实现源文件
#include "Arithmetic.h"

CArithmetic::CArithmetic()
{
}

CArithmetic::~CArithmetic()
{
}

ostream& operator << (ostream &os, const CArithmetic &data)
{
    vector<char>::const_iterator itVec = data.m_vecData.begin();
    for (; itVec != data.m_vecData.end(); ++itVec)
    {
        os << *itVec;
    }
    return os;
}

istream& operator >> (istream &is, CArithmetic &data)
{
    while (1)
    {
        char c = is.get();
        if (' ' == c || '\r' == c || '\n' == c)
        {
            break;
        }
        if (c < '0' || c > '9')
        {
            data.m_vecData.clear();
            cerr << "not accept" << endl;
            break;
        }
        data.m_vecData.push_back(c);
    }
    return is;
}

char CArithmetic::operator [] (int nIndex) const
{
    if (nIndex < 0 || nIndex >= m_vecData.size())
    {
        cerr << "error occur in operator [] function";
        return ' ';
    }
    return m_vecData[nIndex];
}

CArithmetic CArithmetic::operator + (const CArithmetic &data)
{
    int nCarry = 0;
    CArithmetic Arith;
    vector<char>& vecTemp = Arith.m_vecData;

    int i = data.size()      - 1;
    int j = m_vecData.size() - 1;
    for (; i >= 0 || j >= 0; i--, j--)
    {
        char a = i >= 0 ? data[i]      - '0' : 0;
        char b = j >= 0 ? m_vecData[j] - '0' : 0;
        char c = a + b + nCarry;
        nCarry = c / 10;
        vecTemp.push_back(c % 10 + '0');
    }

    // process carry
    if (nCarry != 0)
    {
        vecTemp.push_back(nCarry + '0');
    }

    // store result
    for (i = 0, j = vecTemp.size() - 1; i < j; i++, j--)
    {
        char cTemp = vecTemp[i];
        vecTemp[i] = vecTemp[j];
        vecTemp[j] = cTemp;
    }
    return Arith;
}

CArithmetic CArithmetic::operator - (CArithmetic &data)
{
    return *this;
}

CArithmetic CArithmetic::operator * (const CArithmetic &data)
{
    int nCarry = 0;
    
    CArithmetic Arith;
    CArithmetic ArithTemp;
    vector<char>& vecTemp = ArithTemp.m_vecData;

    int i = data.size() - 1;
    for (; i >= 0; i--)
    {
        char a = data[i] - '0';
        int j = m_vecData.size() - 1;
        for (; j >= 0; j--)
        {
            char b = m_vecData[j] - '0';
            char c = b * a + nCarry;
            nCarry = c / 10;
            vecTemp.push_back(c % 10 + '0');
        }
        if (nCarry != 0)
        {
            vecTemp.push_back(nCarry + '0');
            nCarry = 0;
        }
        
        // store result
        int n = 0;
        int m = vecTemp.size() - 1;
        for (; n < m; n++, m--)
        {
            char cTemp = vecTemp[n];
            vecTemp[n] = vecTemp[m];
            vecTemp[m] = cTemp;
        }

        for (int t = data.size() - 1; t > i; t--)
        {
            vecTemp.push_back('0');
        }

        Arith = Arith + ArithTemp;
        vecTemp.clear();
    }

    return Arith;
}

CArithmetic& CArithmetic::operator = (const CArithmetic &data)
{
    m_vecData.clear();
    vector<char>::const_iterator itVec = data.m_vecData.begin();
    for (; itVec != data.m_vecData.end(); ++itVec)
    {
        m_vecData.push_back(*itVec);
    }
    return *this;
}


main: main.o Arithmetic.o 
	g++ -o main main.o Arithmetic.o
main.o: main.cpp Arithmetic.h
	g++ -c main.cpp
Arithmetic.o: Arithmetic.h Arithmetic.cpp
	g++ -c Arithmetic.cpp
clean:
	rm main.o Arithmetic.o main


上面只实现了加法和乘法,而且还只是整数的,没有小数的,有兴趣的朋友继续完善哈,下次想写了,我也会继续完善这个模块

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值