1028 大数乘法 V2
基准时间限制:2 秒 空间限制:131072 KB 分值: 80 难度:5级算法题
给出2个大整数A,B,计算A*B的结果。
Input
第1行:大数A
第2行:大数B
(A,B的长度 <= 100000,A,B >= 0)
Output
输出A * B
Input示例
123456
234567
Output示例
28958703552
Analysis分析
压位优化然后就可以过了
考验码力
末了,CCZ:你要再加个分治优化吗
qwq不会写实现啊
先留个坑!
Code代码
1 #include<stdio.h> 2 #include<string.h> 3 #include<iostream> 4 using namespace std; 5 6 char cval[1000010]; 7 const int Pow[8] = {1,1,10,100,1000,10000,100000,1000000}; 8 9 int getlen(long long x){ 10 int i; for(i = 0;x;i++,x/= 10); 11 return i; 12 } 13 14 struct BigNum{ 15 int sign,len; 16 long long val[50000]; 17 BigNum(){ memset(val,0,sizeof(val)); sign = 0; len = 0; } 18 19 void read(){ 20 memset(cval,0,sizeof(cval)); 21 memset(val,0,sizeof(val)); 22 len = 0; sign = 0; 23 scanf("%s",cval); 24 int lenc = strlen(cval); 25 if(cval[0] == '-') sign = 1; 26 long long d = 0,dlen = 0; 27 for(int i = lenc-1;i >= sign;i--){ 28 d += (cval[i]-'0')*Pow[++dlen]; 29 if(dlen == 6){ val[(lenc-i-1)/6] = d,d = 0,dlen = 0; } 30 }len = (lenc-sign-1)/6+1; 31 len += 5; while(!val[len-1] && len) len--; 32 val[len] = d; 33 len += 5; while(!val[len-1] && len) len--; 34 // cout << val[0] << endl; 35 36 } 37 38 void print(){ 39 if(sign) cout << '-'; 40 for(int i = len-1;i >= 0;i--){ 41 if(i == len-1) printf("%lld",val[i]); 42 else printf("%06lld",val[i]); 43 }cout << endl; 44 } 45 46 void check(){ 47 if(!len && !val[0]){ sign = 0; return; } 48 long long d = 0; 49 for(int i = 0;i <= len;i++){ 50 val[i] += d; 51 d = val[i]/1000000; 52 val[i] %= 1000000; 53 }while(val[len] || d){ 54 val[len] += d; 55 d = val[len]/1000000; 56 val[len] %= 1000000; 57 len++; 58 }len += 5; while(!val[len-1] && len) len--; 59 } 60 }; 61 62 BigNum mul(BigNum &A,BigNum &B){ 63 BigNum C; 64 C.sign = A.sign xor B.sign; 65 for(int p = 0;p < B.len;p++){ 66 for(int i = 0;i < A.len;i++){ 67 C.val[p+i] += A.val[i]*B.val[p]; 68 } 69 }C.len = A.len+B.len; 70 C.check(); 71 return C; 72 } 73 74 int main(){ 75 76 BigNum Aa,Bb; 77 Aa.read(); 78 // Aa.print(); 79 Bb.read(); 80 // Bb.print(); 81 BigNum Cc = mul(Aa,Bb); 82 Cc.print(); 83 return 0; 84 }