微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

大数四则运算

大数四则运算用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
上面只实现了加法和乘法,而且还只是整数的,没有小数的,有兴趣的朋友继续完善哈,下次想写了,我也会继续完善这个模块

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐