• 18.2.28 codevs3115 高精度练习之乘法


    题目描述 Description

    给出两个正整数A和B,计算A*B的值。保证A和B的位数不超过500位。

    输入描述 Input Description

    读入两个用空格隔开的正整数

    输出描述 Output Description

    输出A*B的值

    样例输入 Sample Input

    3 12

    样例输出 Sample Output

    36

    数据范围及提示 Data Size & Hint

    两个正整数的位数不超过500位

     1 #include <iostream>
     2 #include <string.h>
     3 #include <math.h>
     4 
     5 using namespace std;
     6 
     7 int main()
     8 {
     9     char a[600],b[600];//计算a*b
    10     cin>>a>>b;
    11     //scanf("%s %s",la,lb);
    12     int la=strlen(a),lb=strlen(b),l=0;
    13     int an[600],bn[600];
    14     if(la>lb)
    15     {
    16         for(int i=la-1;i>=la-lb;i--)
    17             bn[i]=b[i-(la-lb)]-'0';
    18         for(int i=0;i<=la-lb-1;i++)
    19             bn[i]=0;
    20         for(int i=0;i<=la-1;i++)
    21             an[i]=a[i]-'0';
    22         l=la-1;
    23     }
    24     else if(la<lb)
    25     {
    26         for(int i=lb-1;i>=lb-la;i--)
    27             an[i]=a[i-(lb-la)]-'0';
    28         for(int i=0;i<=lb-la-1;i++)
    29             an[i]=0;
    30         for(int i=0;i<=lb-1;i++)
    31             bn[i]=b[i]-'0';
    32         l=lb-1;
    33     }
    34     else
    35     {
    36         for(int i=0;i<=la-1;i++)
    37             an[i]=a[i]-'0';
    38         for(int i=0;i<=lb-1;i++)
    39             bn[i]=b[i]-'0';
    40         l=la-1;
    41     }
    42     int a0[600],b0[600];
    43     for(int i=0;i<=l;i++)
    44     {
    45         a0[i]=an[l-i];
    46         b0[i]=bn[l-i];
    47     }
    48     int mul[600]={0};
    49     for(int j=0;j<=l;j++)
    50         for(int i=0;i<=l;i++)
    51         {
    52             mul[i+j]+=a0[i]*b0[j];
    53                 if(i+j!=2*l)
    54                 {
    55                     while(mul[i+j]>=10)
    56                 {
    57                     mul[i+j]-=10;
    58                     mul[i+j+1]++;
    59                 }
    60                 }
    61 
    62         }
    63     int flag=0;
    64         for(int i=2*l;i>=0;i--)
    65         {
    66             if(mul[i]!=0)
    67                 flag=1;
    68             if(flag)
    69             cout<<mul[i];
    70         }
    71         cout<<endl;
    72     return 0;
    73 }
    View Code

    居然wa了好几次……

    最后没耐心了 用的加法模板改的

    比较繁

    mul其实要尽量开大一些……

    我这里没怎么注意

    而在vijos1014中数据就有点不同了

    1014高精度乘法

    描述

    高精度乘法
    输入:两行,每行表示一个非负整数(不超过10000位)
    输出:两数的乘积。

    样例1

    样例输入1

    99
    101

    样例输出1

    9999

    限制

    各个测试点1s

     1 #include <iostream>
     2 #include <string.h>
     3 #include <math.h>
     4 
     5 using namespace std;
     6 char a[10002],b[10002];//计算a*b
     7 int an[10002],bn[10002];
     8 int a0[10002],b0[10002];
     9 int mul[20002]={0};
    10 
    11 int main()
    12 {
    13     cin>>a>>b;
    14     int la=strlen(a),lb=strlen(b),l=0;
    15     if(la>lb)
    16     {
    17         for(int i=la-1;i>=la-lb;i--)
    18             bn[i]=b[i-(la-lb)]-'0';
    19         for(int i=0;i<=la-lb-1;i++)
    20             bn[i]=0;
    21         for(int i=0;i<=la-1;i++)
    22             an[i]=a[i]-'0';
    23         l=la-1;
    24     }
    25     else if(la<lb)
    26     {
    27         for(int i=lb-1;i>=lb-la;i--)
    28             an[i]=a[i-(lb-la)]-'0';
    29         for(int i=0;i<=lb-la-1;i++)
    30             an[i]=0;
    31         for(int i=0;i<=lb-1;i++)
    32             bn[i]=b[i]-'0';
    33         l=lb-1;
    34     }
    35     else
    36     {
    37         for(int i=0;i<=la-1;i++)
    38             an[i]=a[i]-'0';
    39         for(int i=0;i<=lb-1;i++)
    40             bn[i]=b[i]-'0';
    41         l=la-1;
    42     }
    43     for(int i=0;i<=l;i++)
    44     {
    45         a0[i]=an[l-i];
    46         b0[i]=bn[l-i];
    47     }
    48     for(int j=0;j<=l;j++)
    49         for(int i=0;i<=l;i++)
    50         {
    51             mul[i+j]+=a0[i]*b0[j];
    52                 if(i+j!=2*l)
    53                 {
    54                     while(mul[i+j]>=10)
    55                 {
    56                     mul[i+j]-=10;
    57                     mul[i+j+1]++;
    58                 }
    59                 }
    60 
    61         }
    62     int flag=0;
    63         for(int i=2*l;i>=0;i--)
    64         {
    65             if(mul[i]!=0)
    66                 flag=1;
    67             if(flag)
    68             cout<<mul[i];
    69         }
    70         cout<<endl;
    71     return 0;
    72 }
    View Code

    这就需要改一改了……mul开到了两万之大

    注定失败的战争,也要拼尽全力去打赢它; 就算输,也要输得足够漂亮。
  • 相关阅读:
    手工卸载.Net写的win服务
    程序员素质面试题
    GridView数据导出功能
    使用EventLog类写系统日志
    HTML Response ContentType 大全
    用C#做短信CMPP2.0/3.0协议 支持扩展号支持物理网卡
    CYQ.Data 轻量数据层之路 使用篇MAction 数据查询 视频 E (二十二)
    CYQ.Data 轻量数据层之路 V2.0 震撼惊世 支持多数据库/内置Aop(二十五)
    MapXtreme 2005 GIS开发入门系列 索引
    CYQ.Data 轻量数据层之路 框架如何应对数据库变化
  • 原文地址:https://www.cnblogs.com/yalphait/p/8486316.html
Copyright © 2020-2023  润新知