大数相加
Posted wuyepeng
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了大数相加相关的知识,希望对你有一定的参考价值。
题目描述
请设计一个算法能够完成两个用字符串存储的整数进行相加操作,对非法的输入则返回error
输入描述:
输入为一行,包含两个字符串,字符串的长度在[1,100]。
输出描述:
输出为一行。合法情况输出相加结果,非法情况输出error
下面是我第一次写时的代码通过率虽然有80%,但是与正确的算法思想确是天差地别,大整数即使是long类型也会溢出,以致于错误
#include<iostream> #include<sstream> #include<string> using namespace std; int main() { string s1, s2; long long num1, num2,sum; stringstream s_1,s_2; cin >> s1>>s2;//使用stringstream把string类型转化为long long类型 s_1 << s1; s_1 >> num1; s_2 << s2; s_2 >> num2; if (num1 > 0 && num2 > 0) { sum = num1 + num2; cout << sum << endl; } else { cout << "error"; } return 0; }
下面这才是正确的代码:
/*实现两个大整数相加,因为用int和long都不能满足(溢出)*/ #include <iostream> #include <cstring> #include <stack> #include<string> using namespace std; int isnum(string str) { for (int i = 0; i < str.size(); i++) { if (!isdigit(str[i])) //判断是否有非数字的元素 { cout<<"error"<<endl; return 0; } } return 1; } int main() { string a,b; while (cin >> a >> b) { int sum = 0; int n = a.length()-1; int m = b.length()-1; stack<int> istack; int flag = 0; if (isnum(a) && isnum(b)) { while (m >= 0 && n >= 0) { sum = (a[n--] - ‘0‘) + (b[m--] - ‘0‘) + flag;//字符串从后往前相加,跟正常的加法计算一样,flag存放的低位的进位数 flag = sum / 10;//做进位处理,如果两个数相加超过10就把十位的数字存在flag istack.push(sum % 10);//把结果的个位数存入栈中 } if (n >= 0)//如果字符串b结束字符串a还未结束 { sum = (a[n--] - ‘0‘) + flag; flag = sum / 10; istack.push(sum % 10); } if (m >= 0)//如果字符串a结束字符串b还未结束 { sum = (b[m--] - ‘0‘) + flag; flag = sum / 10; istack.push(sum % 10); } if (m < 0 && n < 0&&flag>0)//当a和b串长度相等且有进位时 { istack.push(flag); } while (!istack.empty()) { cout << istack.top(); istack.pop(); } cout << endl; } } return 0; }
以上是关于大数相加的主要内容,如果未能解决你的问题,请参考以下文章