sicly 1381之预处理

来源:互联网 发布:画册在线设计软件 编辑:程序博客网 时间:2024/05/16 19:38

题目在这里1381

a*b,高精度乘法,具体方法不说了,就按照小学时候学乘法的样子模拟一下就好。这里稍微提一下预处理。为什么会说道预处理,因为这道题,我提交了好几次,都显示Wrong Answer。鉴于写sicily的经验,肯定是一些测试用例没有过,所以在本地不断尝试测试的时候,发现如果输入009 87这样的数据,结果有问题。细想一下,发现这不过只是输入的数据有问题,题目故意在刁难,所以只要预先处理一下数据,程序不需要其他的改动。果然,把预处理的程序独立成一个函数,在调用高精度乘法前调用一次,结果输出的时候再调用一次,中间计算加法的时候也调用一次,就AC了。

下面是我的代码,仅供参考:

#include<iostream>#include<string>using namespace std;//去除多余的:0string trim(string s){char* ans = NULL;for (int i = 0; i < s.size(); i++){if (s[i] != '0'){ans = &s[i];break;}}if (ans == NULL)return "0";elsereturn ans;}string addition(string s1, string s2){//对齐  while (s1.size() > s2.size()){s2 = "0" + s2;}//对齐  while (s1.size() < s2.size()){s1 = "0" + s1;}//预留0,处理首位进位  s1 = "0" + s1;s2 = "0" + s2;//加法  int sum = 0;for (int i = s1.size() - 1; i >= 0; i--){sum = (s1[i] - '0') + (s2[i] - '0') + sum;s2[i] = (char)(sum % 10 + '0');sum /= 10;}//去除多余的0  return trim(s2);}string multiplication(string s1, string s2){string add1 = "", add2 = "0", t1;if (s1.size() == s2.size())s1 = "0" + s1;else if (s1.size() < s2.size()){t1 = s1;s1 = s2;s2 = t1;}int mul;for (int i = s2.size() - 1; i >= 0; i--){mul = 0;for (int j = s1.size() - 1; j >= 0; j--){mul = mul + (s2[i] - '0') * (s1[j] - '0');add1 = (char)(mul % 10 + '0') + add1;mul /= 10;}if (mul != 0)add1 = (char)(mul % 10 + '0') + add1;for (int k = s2.size() - 1; k > i; k--){add1 = add1 + "0";}add2 = addition(add1, add2);add1 = "";}return add2;}int main(){int T;string a, b, tmp;char* ans = NULL;cin >> T;while (T--){cin >> a >> b;a = trim(a);b = trim(b);tmp = multiplication(a, b);cout << trim(tmp) << endl;}//system("pause");return 0;}


0 0