Sicily 1381. a*b

来源:互联网 发布:知耻近乎后勇 编辑:程序博客网 时间:2024/05/16 02:58
/*【题目大意】高精度乘法 【解题思路】直接把1129制造出来的大数加法用过来:1、多位数乘一位数,可以直接使用加法完成。2、多位数乘形如d*10n的数,可以转换成多位数乘一位数来处理。3、多位数乘多位数,可以转换为若干个“多位数乘形如d*10n的数与多位数乘一位数”之和。因此,多位数乘多位数最终可以全部用加法来实现,专门另外写乘法什么的···何必如此想不开呢··· *//*Run Time: 0secsRun Memory: 312KB*/#include <iostream>#include <string>using namespace std;string numA, numB;//字符串逆序 inline string changeBack(const string& num){    char buf[num.length()+1];    for(int i=0; i<num.length(); i++)        buf[i] = num[num.length()-i-1];    buf[num.length()] = '\0';    return buf;} //大数加法(反序) inline string Add(string a, string b){    //调节为a长b短     if(a.length() < b.length()){        string buf = a;        a = b;        b = buf;    }     //补零     a += '0';    while(a.length()-b.length() != 0)        b += '0';            int add = 0;    string result = "";     for(int i=0; i<b.length(); i++){        int buf = add + (a[i]-'0') + (b[i]-'0');        if(buf/10 == 1)            add = 1;        else             add = 0;        result += (buf%10) + '0';     }         if(result[result.length()-1] == '0')        return result.substr(0, result.length()-1);    else        return result;   }//乘法由加法组成 string Mult(string a, string b){    a = changeBack(a);    b = changeBack(b);     //调节成a长b短      if(a.length() < b.length()){        string buf = a;        a = b;        b = buf;    }    //一位数乘以多位数,其实就是多位数加num次     string temp[b.length()];   //存放中间值     for(int i=0; i<b.length(); i++){        int num = b[i] - '0';            string buf = "0";        for(int j=0; j<num; j++)            buf = Add(a, buf);        temp[i] = buf;    }    //将不同位数加起来     string result = "0";    for(int i=0; i<b.length(); i++){        string buf = temp[i];        for(int j=0; j<i; j++)            buf = '0' + buf;        result = Add(buf, result);    }    return changeBack(result);} int main(){    int T;    cin >> T;    while (T-->0){        cin >> numA >> numB;             cout << Mult(numA, numB) << endl;     }    return 0;}

原创粉丝点击