使用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; }
相关文章推荐
- 使用main函数的参数,实现一个整数计算器,程序可以接受三个参数,第一个参数“-a”选项执行加法,“-s”选项执行减法,“-m”选项执行乘法,“-d”选项执行除法,后面两个参数为操作数。
- 只使用++运算实现加法,减法,乘法,除法PHP实现
- 使用main函数的参数,实现一个整数计算器,程序可以接受三个参数,第一个参数“-a”选项执行加法,“-s”选项执行减法,“-m”选项执行乘法,“-d”选项执行除法,后面两个参数为操作数。
- 大数 加法,乘法,减法(c++类实现)
- 使用main函数的参数,实现一个整数计算器,程序可以接受三个参数,第一个参数“-a”选项执行加法,“-s”选项执行减法,“-m”选项执行乘法,“-d”选项执行除法,后面两个参数为操作数。
- 使用main函数的参数,实现一个整数计算器,程序可以接受三个参数,第一个参数“-a”选项执行加法,“-s”选项执行减法,“-m”选项执行乘法,“-d”选项执行除法,后面两个参数为操作数。
- 使用main函数的参数,实现一个整数计算器,程序可以接受三个参数,第一个参数“-a”选项执行加法,“-s”选项执行减法,“-m”选项执行乘法,“-d”选项执行除法,后面两个参数为操作数。
- (PHP实现)只使用++运算实现加法,减法,乘法,除法
- 大数加法、减法、乘法、除法实现
- 使用main函数的参数,实现一个整数计算器,程序可以接受三个参数,第一个参数“-a”选项执行加法,“-s”选项执行减法,“-m”选项执行乘法,“-d”选项执行除法,后面两个参数为操作数。
- 剑指offer编程题Java实现——面试题12相关题大数的加法、减法、乘法问题的实现
- 单链表实现大数加法、大数减法、大数乘法、大数指数运算
- (PHP实现)只使用++运算实现加法,减法,乘法,除法
- 使用main函数的参数,实现一个整数计算器,程序可以接受三个参数,第一个参数“-a”选项执行加法,“-s”选项执行减法,“-m”选项执行乘法,“-d”选项执行除法,后面两个参数为操作数。
- 只使用加法实现减法,乘法和除法 [# 68]
- Java实现数组形式的多项式加法、减法、乘法、相除运算
- 线性代数·矩阵的加法减法乘法运算简单实现
- Django 模版中加法、减法、乘法、除法、百分比的使用
- 大数的加法,乘法,全排列实现
- 关于Django模板不能运算的临时解决办法 在Django 模板template 中实现加法,减法,乘法,除法运算