码迷,mamicode.com
首页 > 其他好文 > 详细

[51nod] 1028 大数乘法v2

时间:2017-10-19 21:05:34      阅读:299      评论:0      收藏:0      [点我收藏+]

标签:code   std   pac   技术   .net   示例   name   line   for   

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 }
qwq

 

 

[51nod] 1028 大数乘法v2

标签:code   std   pac   技术   .net   示例   name   line   for   

原文地址:http://www.cnblogs.com/Chorolop/p/7694770.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!