您的位置:首页 > 编程语言 > C语言/C++

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

2017-06-07 15:27 661 查看
这写的就是垃圾,多数还是抄的,没有意思,为了应付作业啥的可以拿去试试,好多东西都算不对。希望后面看到的能自己写,不然以后还要像我一样,重新写一遍。

效果截图:



#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;
}
//小于号判断重载
<
bbee
span class="hljs-keyword">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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐