题目
Description
求两个不超过50位的非负数的积。
Input
有两行,每行是一个不超过50位的非负整数,没有多余的前导0
Output
一行,即相乘后的结果。结果里不能有多余的前导0,即如果结果是0342,则输出342.
Sample Input
12345678900
98765432100Sample Output
1219326311126352690000
题解
代码
/* By:OhYee Github:OhYee Blog:http://www.oyohyee.com/ Email:oyohyee@oyohyee.com かしこいかわいい? エリーチカ! 要写出来Хорошо的代码哦~ */ #include <cstdio> #include <algorithm> #include <cstring> #include <cmath> #include <string> #include <iostream> #include <vector> #include <list> #include <queue> #include <stack> #include <map> #include <set> #include <functional> using namespace std; #define REP(n) for(int o=0;o<n;o++) #define Max(a,b) (a>b?a:b) #define Min(a,b) (a<b?a:b) const int maxn = 10000; class bigNumber { private: int num[maxn + 1]; public: bigNumber() { init(); } void init() { memset(num,0,sizeof(num)); } bigNumber operator = (const char *str) { init(); num[0] = strlen(str); REP(num[0])num[num[0] - o] = str[o] - '0'; return *this; } bigNumber operator = (const bigNumber& rhs) { init(); REP(rhs.num[0] + 1)num[o] = rhs.num[o]; return *this; } bigNumber operator = (long long rhs) { init(); int i = 1; while(rhs) { num[i] = rhs % 10; rhs /= 10; i++; } num[0] = i - 1; return *this; } bool operator < (const bigNumber rhs)const { if(num[0] != rhs.num[0])return (num[0] < rhs.num[0]); REP(num[0]) { int temp = num[0] - o; if(num[temp] != rhs.num[temp])return (num[temp] < rhs.num[temp]); } return 0; } bool operator > (const bigNumber rhs)const { if(num[0] != rhs.num[0])return (num[0] > rhs.num[0]); REP(num[0]) { int temp = num[0] - o; if(num[temp] != rhs.num[temp])return (num[temp] > rhs.num[temp]); } return 0; } bool operator == (const bigNumber rhs)const { return !(*this > rhs || *this < rhs); } bool operator <= (const bigNumber rhs)const { return *this < rhs || *this == rhs; } bigNumber operator + (const bigNumber rhs)const { bigNumber temp; int len; len = num[0] > rhs.num[0] ? num[0] : rhs.num[0]; len++; REP(len) { temp.num[o + 1] += num[o + 1] + rhs.num[o + 1]; temp.num[o + 2] += temp.num[o + 1] / 10; temp.num[o + 1] %= 10; } REP(len) { if(temp.num[len - o] != 0) { temp.num[0] = len - o; break; } } return temp; } bigNumber operator + (const long long rhs)const { bigNumber temp1,temp2; temp1 = *this; temp2 = rhs; return temp1 + temp2; } bigNumber operator * (const bigNumber rhs)const { bigNumber temp; int len; len = num[0] + rhs.num[0]; //len++; for(int i = 1;i <= num[0];i++) { for(int j = 1;j <= rhs.num[0];j++) { temp.num[i + j - 1] += num[i] * rhs.num[j]; temp.num[i + j] += temp.num[i + j - 1] / 10; temp.num[i + j - 1] %= 10; } } REP(len) { if(temp.num[len - o] != 0) { temp.num[0] = len - o; break; } } return temp; } bigNumber operator * (const long long rhs)const { bigNumber temp1,temp2; temp1 = *this; temp2 = rhs; return temp1 * temp2; } bigNumber operator - (const bigNumber rhs)const { bigNumber temp,a,b; temp = Max(*this,rhs); b = Min(*this,rhs); a = temp; temp.init(); int len = a.num[0]; REP(len) { temp.num[o + 1] += 10 + a.num[o + 1] - b.num[o + 1]; temp.num[o + 2]--; temp.num[o + 2] += temp.num[o + 1] / 10; temp.num[o + 1] %= 10; } REP(len) { if(temp.num[len - o] != 0) { temp.num[0] = len - o; break; } } return temp; } bigNumber operator - (const long long rhs)const { bigNumber temp1,temp2; temp1 = *this; temp2 = rhs; return temp1 - temp2; } bigNumber operator / (const bigNumber rhs)const { bigNumber a; int it = num[0]; bigNumber d; bigNumber c; while(it > 0) { a = (d * 10) + num[it]; c = c * 10; int t; REP(9) { if(a < rhs * (o + 1)) { t = o; break; } t = 9; } c = c + t; d = a - rhs*t; it--; } return c; } bigNumber operator / (const long long rhs)const { bigNumber temp1,temp2; temp1 = *this; temp2 = rhs; return temp1 / temp2; } bigNumber operator % (const bigNumber rhs)const { bigNumber a; int it = num[0]; bigNumber d; bigNumber c; while(it > 0) { a = (d * 10) + num[it]; c = c * 10; int t; REP(9) { if(a < rhs * (o + 1)) { t = o; break; } t = 9; } c = c + t; d = a - rhs*t; it--; } return d; } bigNumber operator % (const long long rhs)const { bigNumber temp1,temp2; temp1 = *this; temp2 = rhs; return temp1 % temp2; } void p() { if(num[0] == 0) printf("0"); REP(num[0]) { printf("%d",num[num[0] - o]); } } }; bigNumber a,b,c; char aa[maxn],bb[maxn]; bool Do() { if(scanf("\n%s\n%s",aa,bb)==EOF) return false; a = aa; b = bb; c = a * b; c.p(); putchar('\n'); return true; } int main() { while(Do()); return 0; }