使用C++类实现大数加法,大数减法,大数乘法

来源:互联网 发布:模具ug编程好学吗 编辑:程序博客网 时间:2024/04/28 07:02

这写的就是垃圾,多数还是抄的,没有意思,为了应付作业啥的可以拿去试试,好多东西都算不对。希望后面看到的能自己写,不然以后还要像我一样,重新写一遍。
效果截图:
这里写图片描述

#include <iostream>#include <string>#include <stdlib.h>#define N 1000//算法基本实现思想://一、大数加法://  1.输入大数时应该用字符串,然后根据-'0'得出整数数组//  2.整数运算是先从低位运算,所以这里用数组逆存储。//  3.如果要比较两个数字大小,先判断他们的长度,如果长度相同,//  就判断他们的最高位,依次判断,直到某一位不相等或者全部相同。//  4.输出。重载<<运算符实现输出大数。//  5.实现规则,和一般的加法一样,同位相加,满十进一,当一方只剩下零的时候可以//二、大数减法://  1.比较被减数和减数,如果被减数大于减数,就要向高位借个一。//  2.最后的一位数要注意,可能有多余的零(忽略多余)//  或者全都是零,这时候最起码应该输出一个零//三、大数乘法://  1.高精度与高精度乘法实现起来好可怕,//  会出现整型溢出,所以要判断一下。当每位上的数字大于10的时候,要进位。还是参考了一下算法class BigNum        //大数数据结构类型{public:    int data[2 * N];    int len;    BigNum()    {        memset(data, 0, sizeof(data));      //初始化        len = 0;    }//************************************************************//函 数 名:Compare//参    数:大数数据//返 回 值:1 表示 a>b, -1 表示 a<b, 0 表示 a = b//          主要为了实现> < =的判断重载//函数功能:判断两个数据的大小//************************************************************    long Compare(BigNum a, BigNum b)    {        if (a.len > b.len)return 1;        else if (a.len < b.len)return -1;        else        //如果两数长度相等,只能进行每位判断        {            for (int i = a.len; i >= 0; i--)                if (a.data[i]>b.data[i])return 1;                else if (a.data[i] < b.data[i])return -1;        }        return 0;       //两数相等    }    //+重载    BigNum& operator +(const BigNum &b)    {        BigNum c;        int carry = 0;      //表示进位        int temp;           //暂时存储每一位上的数据        for (int i = 0; i < len || i < b.len; i++)        {            temp = data[i] + b.data[i] + carry; //进位一定要加上            c.data[c.len++] = temp % 10;            carry = temp / 10;        }        if (carry != 0)         //最后一位的处理        {            c.data[c.len++] = carry;        }        return c;    }    //-重载    BigNum operator -(const BigNum &b)    {        BigNum c;        for (int i = 0; i < len || i < b.len; i++)        {            if (data[i] < b.data[i])            {                data[i + 1]--;                data[i] += 10;//借到了10            }            c.data[c.len++] = data[i] - b.data[i];        }        while (c.len - 1 >= 1 && c.data[c.len - 1] == 0)        {            c.len--;//保留了一位        }        return c;    }    //*重载    BigNum operator *(BigNum &b)    {        BigNum c;        for (int i = 0; i < len; i++)        {            for (int j = 0; j < b.len; j++)                c.data[i + j] += data[i] * b.data[j];       //i+j实现扩大十倍        }        for (int i = 0; i < 2 * N - 1; i++)        {            if (c.data[i] > 9)            {                c.data[i + 1] += c.data[i] / 10;        //“瘦身”,即进位                c.data[i] = c.data[i] % 10;            }        }        int i = N - 1;        while (c.data[i] == 0&&i>=0)            i--;        if (i == -1) c.len = 1;         //长度判断和+  -不一样,所以在这要用循环语句。        else c.len = i + 1;        return c;    }    //大于号判断重载    const bool& operator >(BigNum &a)    {        if (Compare(*this, a) == 1)return true;        else return false;    }    //小于号判断重载    const bool& operator <(const BigNum &a)    {        if (Compare(*this, a) == -1)return true;        else return false;    }    //等于号判断重载    const bool& operator ==(const BigNum &a)    {        if (Compare(*this, a) == 0)return true;        else return false;    }    //输出运算符重载    friend std::ostream& operator <<(std::ostream& os, const BigNum &a)    {        for (int i = a.len - 1; i >= 0; i--)        {            os << a.data[i];        }        return os;    }    //输入运算符重载    friend std::istream& operator >>(std::istream& is, BigNum &a)    {        std::string str;        is >> str;        a.len = str.length();        for (int i = 0; i < a.len; i++)        {            a.data[i] = str[a.len-1-i]-'0';         //字符转换成数组        }        return is;    }    //还阔以重载>= <=,但是目前用不到};int main(){    BigNum a,b,c;    std::string option;    std::cout << "请您输入\na\n+\nb\n类似格式,若想判断大小关系,请输入\na\n=\nb\n类似格式:\n";    //循环测试    while (std::cin >> a >> option >> b)    {        std::cout << "━━━━━━━━━━━━━━━━━━━━" << std::endl;        switch (option[0])        {        case'+':std::cout << (c = a + b) << std::endl; break;        case'-':std::cout << (c = a - b) << std::endl; break;        case'*':std::cout << (c = a * b) << std::endl; break;        case'>':if (a > b)std::cout << "Yes\n";                else std::cout << "No\n"; break;        case'<':if (a < b)std::cout << "Yes\n";                else std::cout << "No\n"; break;        case'=':if (a == b)std::cout << "Yes\n";                else std::cout << "No\n";        }        std::cout << "请您继续输入:" << std::endl;    }    system("pause");    return 0;}
原创粉丝点击