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

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

#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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章