[51nod] 1028 大数乘法v2

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

 

 

转载于:https://www.cnblogs.com/Chorolop/p/7694770.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值