• [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
     
  • 相关阅读:
    linux静态链接库
    查看进程运行时间
    进程间同步-互斥量
    Linux——多线程下解决生产消费者模型
    Linux——线程
    浅谈智能指针的历史包袱
    C++ 模板基础
    用信号量为共享内存添加同步机制
    Linux——浅析信号处理
    浅析fork()和底层实现
  • 原文地址:https://www.cnblogs.com/Chorolop/p/7694770.html
Copyright © 2020-2023  润新知