描述

给出两个正整数以及四则运算操作符(+ - * /),求运算结果。

输入第一行:正整数a,长度不超过100
第二行:四则运算符o,o是“+”,“-”,“*”,“/”中的某一个
第三行:正整数b,长度不超过100

保证输入不含多余的空格或其它字符输出一行:表达式“a o b”的值。

补充说明:
1. 减法结果有可能为负数
2. 除法结果向下取整
3. 输出符合日常书写习惯,不能有多余的0、空格或其它字符样例输入

9876543210
+
9876543210

样例输出

19753086420

Code:

#include<iostream>
#include<cstring>
using namespace std; const int MAXLEN = 201; int Substract(int *p1, int *p2, int len1, int len2) {
int i;
if (len1 == len2) {
for (i = len1 - 1; i >= 0; ++i) {
if (p1[i] < p2[i]) return -1; // p1 < p2
else if (p1[i] > p2[i]) break; // p1 > p2
}
}
for (i = 0; i < len1; ++i) { // 要求调用本函数确保当i >= len2 时, p2[i] = 0
p1[i] -= p2[i];
if (p1[i] < 0) {
p1[i] += 10;
--p1[i+1];
}
}
for (i = len1 - 1; i >= 0; --i) {
if (p1[i]) return i + 1; // 找到最高位第一个不为0
return 0; // 全部为0说明两者相等
}
} class Integer {
private:
int is_neg;
int len;
int s[MAXLEN];
char str[MAXLEN]; public:
Integer(const char *string = "") {
memset(s, 0, MAXLEN*sizeof(int));
memset(str, 0, MAXLEN*sizeof(char));
strcpy(str, string);
is_neg = 0;
len = strlen(str);
for (int i = 0; i < len; ++i) {
s[i] = int(str[len-1-i]) - 48; // s[i]低位在左, 高位在右。
}
} Integer& operator = (const Integer& oth) {
if (this == &oth) return *this;
memset(s, 0, MAXLEN*sizeof(int));
memset(str, 0, MAXLEN*sizeof(char));
is_neg = oth.is_neg;
len = oth.len;
for (int i = 0; i < oth.len; ++i) {
s[i] = oth.s[i];
}
strcpy(str, oth.str);
return *this;
} bool operator == (const Integer& oth) {
if (this == &oth) return true;
bool ret = true;
if (len != oth.len || is_neg != oth.is_neg)
ret = false;
if (strcmp(str, oth.str)) ret = false;
for (int i = 0; i < oth.len; ++i) {
if (s[i] != oth.s[i]) ret = false;
}
return ret;
} bool operator != (const Integer& oth) {
return !(*this == oth);
} Integer operator+(const Integer& oth) {
Integer c;
int length = len >= oth.len ? len : oth.len;
length += 1;
c.len = length;
for (int i = 0; i < c.len; ++i) {
c.s[i] += s[i] + oth.s[i];
c.s[i+1] += c.s[i] / 10;
c.s[i] = c.s[i] % 10;
} while ((c.len > 1) && (c.s[c.len-1] == 0))
c.len--; return c;
} Integer operator-(const Integer& oth) {
Integer c;
int flag = 0; if (len > oth.len) flag = 1;
else if (len < oth.len) flag = -1;
else flag = strcmp(str, oth.str); if (flag >= 0) {
c.len = len;
int borrow = 0;
for (int i = 0; i < c.len; ++i) {
c.s[i] += s[i] - oth.s[i];
if (borrow) c.s[i] -= 1;
if (c.s[i] < 0) {
c.s[i] += 10;
borrow = 1;
} else {
borrow = 0;
}
}
while ((c.len > 1) && (c.s[c.len-1] == 0))
c.len--;
} else {
c.is_neg = 1;
c.len = oth.len;
int borrow = 0;
for (int i = 0; i < c.len; ++i) {
c.s[i] += oth.s[i] - s[i];
if (borrow) c.s[i] -= 1;
if (c.s[i] < 0) {
c.s[i] += 10;
borrow = 1;
} else {
borrow = 0;
}
}
while ((c.len > 1) && (c.s[len-1] == 0))
c.len--;
}
return c;
} Integer operator*(const Integer& oth) {
Integer c;
c.len = len + oth.len + 1;
for (int i = 0; i < len; ++i) {
for (int j = 0; j < oth.len; ++j) {
c.s[i+j] += s[i] * oth.s[j];
c.s[i+j+1] += c.s[i+j] / 10;
c.s[i+j] = c.s[i+j] % 10;
}
}
while ((c.len > 1) && (c.s[c.len-1] == 0))
c.len--; return c;
} Integer operator/(Integer& oth) {
Integer c;
c.len = MAXLEN;
int i, temp;
if (len < oth.len) {
for (int i = 0; i < MAXLEN; ++i) {
c.s[i] = 0;
}
return c;
}
int nTimes = len - oth.len;
if (nTimes > 0) {
for (i = len-1; i >= nTimes; --i) {
oth.s[i] = oth.s[i-nTimes];
}
for (; i >= 0; --i) {
oth.s[i] = 0;
}
oth.len = len;
}
for (i = 0; i <= nTimes; ++i) {
while ((temp = Substract(s, oth.s+i, len, oth.len-i)) >= 0) {
len = temp;
++c.s[nTimes-i];
}
}
while ((c.len > 1) && (c.s[c.len-1] == 0))
c.len--; return c;
} friend ostream & operator<<(ostream& out, const Integer& oth) {
if (oth.is_neg) out << "-";
for (int k = oth.len-1; k >= 0; --k)
out << oth.s[k];
return out;
}
}; int main() {
char s1[MAXLEN], s2[MAXLEN];
char ope;
cin >> s1;
cin >> ope;
cin >> s2;
Integer a(s1);
Integer b(s2); switch (ope) {
case '+':
cout << a + b << endl;
break;
case '-':
cout << a - b << endl;
break;
case '*':
cout << a * b << endl;
break;
case '/':
cout << a / b << endl;
break;
} return 0;
}

  

reference:

https://blog.csdn.net/ApplePeel_90/article/details/80066215

D:大整数的加减乘除的更多相关文章

  1. POJ C++程序设计 编程题#1 大整数的加减乘除

    编程题#4:大整数的加减乘除 来源: POJ (Coursera声明:在POJ上完成的习题将不会计入Coursera的最后成绩.) 注意: 总时间限制: 1000ms 内存限制: 65536kB 描述 ...

  2. N!的阶乘附带简单大整数类的输入输出(暂时没有深入的了解)

    Given an integer N(0 ≤ N ≤ 10000), your task is to calculate N! 我的思路:就想着大整数类去了,才发现自己还不能很好的掌握,其实这是一个大 ...

  3. Java 实现大整数加减乘除

    自己用Java实现的大整数加减乘除运算.还有可以改进的地方,有兴趣的童鞋可以加以改进.仅供参考,请勿转载! package barrytest; import java.util.ArrayList; ...

  4. 大整数类BIGN的设计与实现 C++高精度模板

    首先感谢刘汝佳所著的<算法竞赛入门经典>. 众所周知,C++中储存能力最大的unsigned long long 也是有着一个上限,如果我们想计算非常大的整数时,就不知所措了,所以,我写了 ...

  5. C++高精度计算(大整数类)

    Java和Pathon可以不用往下看了 C++的基本数据类型中,范围最大的数据类型不同编译器不同,但是最大的整数范围只有[-2^63-2^63-1](对应8个字节所对应的二进制数大小).但是对于某些需 ...

  6. poj2389-Bull Math(大整数乘法)

    一,题意: 大整数乘法模板题二,思路: 1,模拟乘法(注意"逢十进一") 2,倒序输出(注意首位0不输出) 三,步骤: 如:555 x 35 = 19425  5 5 5  5 5 ...

  7. AC日记——大整数的因子 openjudge 1.6 13

    13:大整数的因子 总时间限制:  1000ms 内存限制:  65536kB 描述 已知正整数k满足2<=k<=9,现给出长度最大为30位的十进制非负整数c,求所有能整除c的k. 输入 ...

  8. Ac日记——大整数减法 openjudge 1.6 11

    11:大整数减法 总时间限制:  1000ms 内存限制:  65536kB 描述 求两个大的正整数相减的差. 输入 共2行,第1行是被减数a,第2行是减数b(a > b).每个大整数不超过20 ...

  9. AC日记——大整数加法 openjudge 1.6 10

    10:大整数加法 总时间限制:  1000ms 内存限制:  65536kB 描述 求两个不超过200位的非负整数的和. 输入 有两行,每行是一个不超过200位的非负整数,可能有多余的前导0. 输出 ...

随机推荐

  1. mysql跟踪执行的sql语句

    修改my.cnf配置文件 /usr/local/mysql/bin/mysql --verbose --help | grep -A 1 'Default options' Default optio ...

  2. Canopy聚类算法

    Canopy聚类算法(经典,看图就明白) 聚类算法. 这个算法获得的并不是最终结果,它是为其他算法服务的,比如k-means算法.它能有效地降低k-means算法中计算点之间距离的复杂度. 图中有一个 ...

  3. Maven Assembly打包提示[WARNING] transitive dependencies if any will not be available

    maven assembly打包出现错误 [WARNING] The POM for com.flink.xxr:0.0.1-SNAPSHOT is invalid, transitive depen ...

  4. Angular-cli新建项目目录结构详解

    Angular-cli新建项目目录结构详解 在上一篇博客中我们已经通过Angular CLI命令行工具创建出来一个全新的Angular项目,要想写项目,首先我们要先搞清楚项目的目录结构是怎样的,每个文 ...

  5. 常用的软件设计模式的Java实现——让编程从野生到飞起

    常用的软件设计模式的Java实现——让编程从野生到飞起_野生技术协会_科技_bilibili_哔哩哔哩  https://www.bilibili.com/video/av7596511/

  6. Spark,一种快速数据分析替代方案

    原文出处:http://www.ibm.com/developerworks/library/os-spark/ Spark 是一种与 Hadoop 相似的开源集群计算环境,但是两者之间还存在一些不同 ...

  7. java基础之JDBC三:简单工具类的提取及应用

    简单工具类: public class JDBCSimpleUtils { /** * 私有构造方法 */ private JDBCSimpleUtils() { } /** * 驱动 */ publ ...

  8. Python_13-Office文件数据操作

    目录: 1.1      安装win32com模块 1.2      Access数据库操作 1.2.1       建立db1.db数据库,设计一张表t_student_b 1.3      Exc ...

  9. libevent源码深度剖析十

    libevent源码深度剖析十 ——支持I/O多路复用技术 张亮 Libevent的核心是事件驱动.同步非阻塞,为了达到这一目标,必须采用系统提供的I/O多路复用技术,而这些在Windows.Linu ...

  10. cocos2d-x 在vs2010下的搭建(win7系统)

    1从官网下载cocos2d-x2.1.3的源码地址如下: http://cocos2d-x.org/ 2.解压下载的软件包我们会发现红框中vs2010的项目文件双击打开它 3.打开后我们要生成一些wi ...