我们知道,所有的数据类型,例如int、long int、double等等,他们所存放的数据都是有范围的,那么问题来了,当出现两个特别大的数,就算是用long long int也存放不下的时候,我们应该如何去计算呢
hdoj 的1002题就出现了这种情况(可以考虑一下再往下看)
这个时候的解决方法一般是使用字符串来解决,当然用c++还是很麻烦的,java的话听说好像有库函数可以直接调用,我现在来写一下c++的解决方案
#include<iostream> #include<algorithm> #include<string> using namespace std; string add(string a , string b); int main() { string a , b; cin >> a >> b; add(a,b); cout << add(a,b) << endl; return 0; } string add(string a , string b) { a = a.substr(a.find_first_not_of('0')); //把字串中前面的0去掉 b = b.substr(b.find_first_not_of('0')); long long lenA = a.length(); //用lenA来保存A的长度 long long lenB = b.length(); long long len = max(a.length() ,b.length()) + 5; //用len就是答案的长度 ,当a和b的长度相同时,加起来可能会进一位,所以可以多加一点点 reverse(a.begin() , a.end()); //下面计算时时从前往后计算,也就是说先算的高位 reverse(b.begin() , b.end()); //所以要转换一下 把串反转,就会用到reverse函数 string ans(len , '0'); //定义存放答案的串,长度为len,全部初始化为'0' for(int i = 0 ; i < a.length() ; ++ i)//将a串中的字符全部放在c串中 { ans[i] = a[i]; } int temp = 0;//表示进位 for(int i = 0 ; i < len ; ++i) { if (i < b.length()) temp+=(ans[i] - '0') + (b[i] - '0'); //计算进位 如9+9=18 else temp+=(ans[i] - '0'); ans[i] = temp%10 + '0'; //将进位的个位数保存 将8保留 temp/=10; //十位数保留,给下一次计算 1放在下一次计算 } reverse(ans.begin(),ans.end()); //算完了之后记得翻转过来 return ans.substr(ans.find_first_not_of('0'));//反转过来可能有0,去掉 }
Comments NOTHING