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