C/C++实现大整数加减法
来源:互联网 发布:少女前线敌人数据 编辑:程序博客网 时间:2024/05/18 02:21
http://115.29.224.174/JudgeOnline/problem.php?id=1053
采用存粹的字符串处理,涉及到
数字的优化(符号处理,去零)
字符串数字大小的比较
字符串的加法
字符串的减法
ac代码
#include <cstdio>#include <cstdlib>#include <cstring>#include <iostream>#include <string>using namespace std;string strAdd(string s1, string s2){ string rs =""; int len1 = s1.size(); int len2 = s2.size(); int carry = 0; int i = len1 - 1; int j = len2 - 1; while(i >= 0 && j >= 0) { char c1 = s1[i]; char c2 = s2[j]; int i1 = c1 - '0'; int i2 = c2 - '0'; int tmp = i1 + i2 + carry; carry = tmp / 10; int nowVal = tmp % 10; char nowC = nowVal + '0'; rs += nowC; i--; j--; } if(i >= 0) { while(i >= 0) { char c1 = s1[i]; int i1 = c1 - '0'; int tmp = i1 + carry; carry = tmp / 10; int nowVal = tmp % 10; char nowC = nowVal + '0'; rs += nowC; i--; } } if(j >= 0) { while(j >= 0) { char c2 = s2[j]; int i2 = c2 - '0'; int tmp = i2 + carry; carry = tmp / 10; int nowVal = tmp % 10; char nowC = nowVal + '0'; rs += nowC; j--; } } if(carry > 0) { char nowC = carry + '0'; rs += nowC; } string rs2(rs.rbegin(), rs.rend()); return rs2;}// 假设s1 > s2string strSub(string s1, string s2){ string rs =""; int len1 = s1.size(); int len2 = s2.size(); int need_carry = 0; int i = len1 - 1; int j = len2 - 1; while(i >= 0 && j >= 0) { char c1 = s1[i]; char c2 = s2[j]; int i1 = c1 - '0'; int i2 = c2 - '0'; int nowVal; if(need_carry != 0) { if(i1 < need_carry) { int tmpi1 = 10 + i1 - need_carry; nowVal = tmpi1 - i2; need_carry = 1; }else{ int tmpc1 = i1 - need_carry; if(tmpc1 >= i2) { nowVal = tmpc1 - i2; need_carry = 0; }else{ nowVal = 10 + tmpc1 - i2; need_carry = 1; } } }else{ if(i1 >= i2) { nowVal = i1 - i2; need_carry = 0; }else{ nowVal = 10 + i1 - i2; need_carry = 1; } } char nowC = nowVal + '0'; rs += nowC; i--; j--; } while(i >= 0) { char c1 = s1[i]; int i1 = c1 - '0'; if(i == 0 && i1 == need_carry) { break; } int nowVal; if(need_carry != 0) { if(i1 < need_carry) { int tmpi1 = 10 + i1 - need_carry; nowVal = tmpi1; need_carry = 1; }else{ int tmpc1 = i1 - need_carry; if(tmpc1 >= 0) { nowVal = tmpc1; need_carry = 0; }else{ nowVal = 10 + tmpc1; need_carry = 1; } } }else{ if(i1 >= 0) { nowVal = i1 - 0; need_carry = 0; }else{ nowVal = 10 + i1 - 0; need_carry = 1; } } char nowC = nowVal + '0'; rs += nowC; i--; } string rs2(rs.rbegin(), rs.rend()); return rs2;}// 得到一个正确的数,把一些无用的零 去掉string getRs(string ans){ int len = ans.size(); if(len <= 0) return "0"; if(ans[0] == '-') { int k = 1; while(k < len && ans[k] == '0') k++; if(k == len) return "0"; else{ return "-" + ans.substr(k); } }else{ int k = 0; while(k < len && ans[k] == '0') k++; if(k == len) return "0"; else{ return ans.substr(k); } }}// 判断两个数谁大, 两个数都是有效的正数int cp(string s1, string s2){ int len1 = s1.size(); int len2 = s2.size(); if(len1 > len2) return 1; else if(len1 < len2) return -1; else{ for(int i=0;i<len1;i++) { if(s1[i] > s2[i]) return 1; if(s1[i] < s2[i]) return -1; } } return 0;}// 假设s1 s2 都是合法的数字string strCal(string s1,string s2){ int flag1 = 1; int flag2 = 1; if(s1[0] == '-') { s1 = s1.substr(1); flag1 = -1; }else if(s1[0] == '+') { s1 = s1.substr(1); } if(s2[0] == '-') { s2 = s2.substr(1); flag2 = -1; }else if(s2[0] == '+') { s2 = s2.substr(1); } string ans; if(flag1 == 1 && flag2 == 1) { //return strAdd(s1, s2); ans = strAdd(s1, s2); }else if(flag1 == -1 && flag2 == -1) { string rs = strAdd(s1, s2); rs = "-" + rs; //return rs; ans = rs; }else if(flag1 == 1 && flag2 == -1) { if(cp(s1, s2) >= 0) { //return strSub(s1, s2); ans = strSub(s1, s2); }else{ string rs = strSub(s2, s1); rs = "-" + rs; //return rs; ans = rs; } }else{ if(cp(s2, s1) >= 0) { //return strSub(s2, s1); ans = strSub(s2, s1); }else{ string rs = strSub(s1, s2); rs = "-" + rs; //return rs; ans = rs; } } return getRs(ans);}int main(){ //freopen("in.txt", "r", stdin); string s1,s2; while(cin >> s1 >> s2) { s1 = getRs(s1); s2 = getRs(s2); string ans = strCal(s1,s2); cout << ans << endl; } return 0;}
0 0
- C/C++实现大整数加减法
- 大整数类-实现加减法
- 大整数加减法(C++实现)
- 大整数加减乘除 c实现
- 大整数加减法
- 大整数加减法
- 大整数加减法
- 大整数加减法
- 大整数乘法(C语言实现)
- 大整数加法(C程序实现)
- 大整数乘法-C语言实现
- C语言实现大整数运算
- C 大整数加法计算实现
- c++ 大整数类CCBigInteger 加减法功能的实现
- 高精度计算-大整数加减法
- C 大整数相加
- 【c++】复数加减法类
- [C++]第七次作业:实现一个大整数类BigInt
- LeetCode刷题【Array】 Subsets
- ubuntu16.04+git
- CJOJ 2403 次小生成树
- windows下jira系统的安装和破解注意事项
- iOS 字典JSON互相转换
- C/C++实现大整数加减法
- 【Java】线程安全的单例模式----静态内部类
- 剑指Offer系列-面试题47:不用加减乘除做加法
- springmvc对request的处理流程
- 最短路 SPFA 判断负环 静态邻接表(链式前向星) HDU 2544 最短路 POJ 3259 Wormholes
- 实现生成代理类的原理
- Spring多数据源配置二
- mysql数据库开始——查询
- 你知道什么是数据结构吗?反正我不知道。