這寫的就是垃圾,多數還是抄的,沒有意思,爲了應付作業啥的可以拿去試試,好多東西都算不對。希望後面看到的能自己寫,不然以後還要像我一樣,重新寫一遍。
效果截圖:
#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;
}