描述

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

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

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

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

  1. 9876543210
  2. +
  3. 9876543210

样例输出

  1. 19753086420

Code:

  1. #include<iostream>
  2. #include<cstring>
  3. using namespace std;
  4.  
  5. const int MAXLEN = 201;
  6.  
  7. int Substract(int *p1, int *p2, int len1, int len2) {
  8. int i;
  9. if (len1 == len2) {
  10. for (i = len1 - 1; i >= 0; ++i) {
  11. if (p1[i] < p2[i]) return -1; // p1 < p2
  12. else if (p1[i] > p2[i]) break; // p1 > p2
  13. }
  14. }
  15. for (i = 0; i < len1; ++i) { // 要求调用本函数确保当i >= len2 时, p2[i] = 0
  16. p1[i] -= p2[i];
  17. if (p1[i] < 0) {
  18. p1[i] += 10;
  19. --p1[i+1];
  20. }
  21. }
  22. for (i = len1 - 1; i >= 0; --i) {
  23. if (p1[i]) return i + 1; // 找到最高位第一个不为0
  24. return 0; // 全部为0说明两者相等
  25. }
  26. }
  27.  
  28. class Integer {
  29. private:
  30. int is_neg;
  31. int len;
  32. int s[MAXLEN];
  33. char str[MAXLEN];
  34.  
  35. public:
  36. Integer(const char *string = "") {
  37. memset(s, 0, MAXLEN*sizeof(int));
  38. memset(str, 0, MAXLEN*sizeof(char));
  39. strcpy(str, string);
  40. is_neg = 0;
  41. len = strlen(str);
  42. for (int i = 0; i < len; ++i) {
  43. s[i] = int(str[len-1-i]) - 48; // s[i]低位在左, 高位在右。
  44. }
  45. }
  46.  
  47. Integer& operator = (const Integer& oth) {
  48. if (this == &oth) return *this;
  49. memset(s, 0, MAXLEN*sizeof(int));
  50. memset(str, 0, MAXLEN*sizeof(char));
  51. is_neg = oth.is_neg;
  52. len = oth.len;
  53. for (int i = 0; i < oth.len; ++i) {
  54. s[i] = oth.s[i];
  55. }
  56. strcpy(str, oth.str);
  57. return *this;
  58. }
  59.  
  60. bool operator == (const Integer& oth) {
  61. if (this == &oth) return true;
  62. bool ret = true;
  63. if (len != oth.len || is_neg != oth.is_neg)
  64. ret = false;
  65. if (strcmp(str, oth.str)) ret = false;
  66. for (int i = 0; i < oth.len; ++i) {
  67. if (s[i] != oth.s[i]) ret = false;
  68. }
  69. return ret;
  70. }
  71.  
  72. bool operator != (const Integer& oth) {
  73. return !(*this == oth);
  74. }
  75.  
  76. Integer operator+(const Integer& oth) {
  77. Integer c;
  78. int length = len >= oth.len ? len : oth.len;
  79. length += 1;
  80. c.len = length;
  81. for (int i = 0; i < c.len; ++i) {
  82. c.s[i] += s[i] + oth.s[i];
  83. c.s[i+1] += c.s[i] / 10;
  84. c.s[i] = c.s[i] % 10;
  85. }
  86.  
  87. while ((c.len > 1) && (c.s[c.len-1] == 0))
  88. c.len--;
  89.  
  90. return c;
  91. }
  92.  
  93. Integer operator-(const Integer& oth) {
  94. Integer c;
  95. int flag = 0;
  96.  
  97. if (len > oth.len) flag = 1;
  98. else if (len < oth.len) flag = -1;
  99. else flag = strcmp(str, oth.str);
  100.  
  101. if (flag >= 0) {
  102. c.len = len;
  103. int borrow = 0;
  104. for (int i = 0; i < c.len; ++i) {
  105. c.s[i] += s[i] - oth.s[i];
  106. if (borrow) c.s[i] -= 1;
  107. if (c.s[i] < 0) {
  108. c.s[i] += 10;
  109. borrow = 1;
  110. } else {
  111. borrow = 0;
  112. }
  113. }
  114. while ((c.len > 1) && (c.s[c.len-1] == 0))
  115. c.len--;
  116. } else {
  117. c.is_neg = 1;
  118. c.len = oth.len;
  119. int borrow = 0;
  120. for (int i = 0; i < c.len; ++i) {
  121. c.s[i] += oth.s[i] - s[i];
  122. if (borrow) c.s[i] -= 1;
  123. if (c.s[i] < 0) {
  124. c.s[i] += 10;
  125. borrow = 1;
  126. } else {
  127. borrow = 0;
  128. }
  129. }
  130. while ((c.len > 1) && (c.s[len-1] == 0))
  131. c.len--;
  132. }
  133. return c;
  134. }
  135.  
  136. Integer operator*(const Integer& oth) {
  137. Integer c;
  138. c.len = len + oth.len + 1;
  139. for (int i = 0; i < len; ++i) {
  140. for (int j = 0; j < oth.len; ++j) {
  141. c.s[i+j] += s[i] * oth.s[j];
  142. c.s[i+j+1] += c.s[i+j] / 10;
  143. c.s[i+j] = c.s[i+j] % 10;
  144. }
  145. }
  146. while ((c.len > 1) && (c.s[c.len-1] == 0))
  147. c.len--;
  148.  
  149. return c;
  150. }
  151.  
  152. Integer operator/(Integer& oth) {
  153. Integer c;
  154. c.len = MAXLEN;
  155. int i, temp;
  156. if (len < oth.len) {
  157. for (int i = 0; i < MAXLEN; ++i) {
  158. c.s[i] = 0;
  159. }
  160. return c;
  161. }
  162. int nTimes = len - oth.len;
  163. if (nTimes > 0) {
  164. for (i = len-1; i >= nTimes; --i) {
  165. oth.s[i] = oth.s[i-nTimes];
  166. }
  167. for (; i >= 0; --i) {
  168. oth.s[i] = 0;
  169. }
  170. oth.len = len;
  171. }
  172. for (i = 0; i <= nTimes; ++i) {
  173. while ((temp = Substract(s, oth.s+i, len, oth.len-i)) >= 0) {
  174. len = temp;
  175. ++c.s[nTimes-i];
  176. }
  177. }
  178. while ((c.len > 1) && (c.s[c.len-1] == 0))
  179. c.len--;
  180.  
  181. return c;
  182. }
  183.  
  184. friend ostream & operator<<(ostream& out, const Integer& oth) {
  185. if (oth.is_neg) out << "-";
  186. for (int k = oth.len-1; k >= 0; --k)
  187. out << oth.s[k];
  188. return out;
  189. }
  190. };
  191.  
  192. int main() {
  193. char s1[MAXLEN], s2[MAXLEN];
  194. char ope;
  195. cin >> s1;
  196. cin >> ope;
  197. cin >> s2;
  198. Integer a(s1);
  199. Integer b(s2);
  200.  
  201. switch (ope) {
  202. case '+':
  203. cout << a + b << endl;
  204. break;
  205. case '-':
  206. cout << a - b << endl;
  207. break;
  208. case '*':
  209. cout << a * b << endl;
  210. break;
  211. case '/':
  212. cout << a / b << endl;
  213. break;
  214. }
  215.  
  216. return 0;
  217. }

  

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. 关于object-c类目的理解

    类目:为已知的类增加新的方法: 一.类目: 1. 类目方法的应用: 对现有类进行扩展:比如:可以扩展Cocoa touch框架中的类,在类目中增加的方法会被子类继承,而且在运行时跟其他的方法没有区别. ...

  2. 前端自动化之gulp

    前端自动化之gulp 前题:1.安装好nodejs环境,或者nvm 2.安装npm包管理工具 简介: 可以自动的将开发阶段的代码进行压缩.合并.编译.加密等处理,生成项目提交的代码. 使用: gulp ...

  3. jenkins 学习记录1

    主题 以前自己做些小玩意儿比如博客(http://blogv3.labofjet.com/)的时候,在远程服务器上的tomcat发布工程用的是目录的结构,而不是war.原因很简单.用目录结构的话每次只 ...

  4. const的作用

    const的作用 const是C语言的一种关键字,起受保护,防止以外的变动的作用!可以修饰变量,参数,返回值,甚至函数体.const可以提高程序的健壮性,你只管用到你想用的任何地方. (一)const ...

  5. Timer的缺陷

  6. 斐波那契数列,跳台阶(dp思想)

    一 . 斐波那契数列:1,1,2,3,5,8,13,21 即后一项是前两项的和. class Solution { private: ]; public: Solution() { memset(ar ...

  7. consul event

    Command: consul event event 命令提供了一种机制来将自定义用户事件触发到整个数据中心. 这些事件对Consul来说是不透明的,但是它们可以用来构建脚本基础架构来执行自动化部署 ...

  8. java基础之多线程一:概述

    概述: 进程有多条执行路径, 合成为: 多线程. 进程和线程的描述: 进程: 可执行程序(文件), 例如: .exe//可以把进程理解为一辆车. 一台电脑上可以有多个进程, 这些进程之间的数据是相互隔 ...

  9. SpringBoot27 JDK动态代理详解、获取指定的类类型、动态注册Bean、接口调用框架

    1 JDK动态代理详解 静态代理.JDK动态代理.Cglib动态代理的简单实现方式和区别请参见我的另外一篇博文. 1.1 JDK代理的基本步骤 >通过实现InvocationHandler接口来 ...

  10. keepalived+lvs高可用配置

    global_defs { notification_email { test@qq.com } notification_email_from sns-lvs@gmail.com smtp_serv ...