zoukankan      html  css  js  c++  java
  • 高精度乘法

    高精度乘法就是把 a 的每一位和 b 相乘。

    关键的一件事就是别把积 c 数组 的每一位弄错了,比如用 a 的第 i 位 a[i] 乘以 b[j] ,那么对应的 c 的位数就是 c[i + j] (i,j都是从0开始),列一个竖式就能很直观地看出来了。

    还有一件事就是 c 数组的位数问题,一个 n 位数的数乘以一个 m 位数的数,的数最多是一个 n + m 位数的数,所以 c 数组要开 2 * maxn

    上代码

     1 #include<cstdio>
     2 #include<iostream>
     3 #include<cmath>
     4 #include<cstring>
     5 using namespace std;
     6 const int maxn = 1e3 +5;
     7 char a1[maxn], b1[maxn];
     8 int a[maxn], b[maxn], c[2 * maxn];    //c的最高位最大为 la + lb,所以 maxn * 2 
     9 int main()
    10 {
    11     gets(a1); gets(b1);
    12     int la = strlen(a1), lb = strlen(b1);
    13     for(int i  = 0; i < la; ++i) a[i] = a1[la - i - 1] - '0';
    14     for(int i  = 0; i < lb; ++i) b[i] = b1[lb - i - 1] - '0';        //读入 
    15     for(int i = 0; i < la; ++i)            //用b乘以a的每一位 
    16     {
    17         for(int j = 0; j < lb; ++j)
    18         {
    19             c[i + j] += a[i] * b[j];
    20             c[i + j + 1] += c[i + j] / 10;        //给下一位进位 
    21             c[i + j] %= 10;
    22         }
    23     }
    24     int lc = la + lb;         
    25     while(c[lc] == 0 && lc > 0)  lc--;    //删除前导零 
    26     for(int i = lc; i >= 0; --i) printf("%d", c[i]);
    27     printf("
    ");
    28     return 0;
    29 }

    还有一个比较丑的带负数的代码

     1 #include<cstdio>
     2 #include<iostream>
     3 #include<cmath>
     4 #include<algorithm>
     5 #include<cstring>
     6 #include<cstdlib>
     7 #include<cctype>
     8 #include<vector>
     9 #include<stack>
    10 #include<queue>
    11 using namespace std;
    12 #define enter puts("") 
    13 #define space putchar(' ')
    14 #define Mem(a, x) memset(a, x, sizeof(a))
    15 #define rg register
    16 typedef long long ll;
    17 typedef double db;
    18 const int INF = 0x3f3f3f3f;
    19 const db eps = 1e-8;
    20 const int maxn = 505;
    21 inline ll read()
    22 {
    23   ll ans = 0;
    24   char ch = getchar(), last = ' ';
    25   while(!isdigit(ch)) last = ch, ch = getchar();
    26   while(isdigit(ch)) ans = (ans << 1) + (ans << 3) + ch - '0', ch = getchar();
    27   if(last == '-') ans = -ans;
    28   return ans;
    29 }
    30 inline void write(ll x)
    31 {
    32   if(x < 0) x = -x, putchar('-');
    33   if(x >= 10) write(x / 10);
    34   putchar(x % 10 + '0');
    35 }
    36 
    37 char a1[maxn], b1[maxn];
    38 int a[maxn], b[maxn], c[maxn << 1];
    39 int flg1 = 0, flg2 = 0;
    40 
    41 int main()
    42 {
    43     scanf("%s%s", a1, b1);
    44     int la = strlen(a1), lb = strlen(b1);
    45     if(a1[0] == '-')
    46     {
    47         flg1 = 1;
    48         for(int i = 1; i < la; ++i) a1[i - 1] = a1[i];
    49         la--;
    50     }
    51     if(b1[0] == '-')
    52     {
    53         flg2 = 1;
    54         for(int i = 1; i < lb; ++i) b1[i - 1] = b1[i];
    55         lb--;
    56     }    
    57     for(int i = 0; i < la; ++i) a[i + 1] = a1[la - i - 1] - '0';
    58     for(int i = 0; i < lb; ++i) b[i + 1] = b1[lb - i - 1] - '0';
    59     for(int i = 1; i <= la; ++i)
    60         for(int j = 1; j <= lb; ++j)
    61         {
    62             c[i + j] += a[i] * b[j];
    63             c[i + j + 1] += c[i + j] / 10;
    64             c[i + j] %= 10;
    65         }
    66     int x = la + lb + 5;
    67     while(!c[x] && x > 2) x--;
    68     bool flg3 = 1;
    69     if(!c[x] && x == 2) flg3 = 0;
    70     if(flg1 ^ flg2 && flg3) putchar('-');
    71     for(int i = x; i > 1; --i) write(c[i]); enter;
    72     return 0;
    73 }
  • 相关阅读:
    Solr7使用Oracle数据源导入+中文分词
    自动签发https证书工具 cert manager
    Docker容器服务发现方案
    Registrator中文文档
    C#重试公用类
    sqlserver 2017 docker安装(启动代理)
    【转】如何将MySQL数据目录更改为CentOS 7上的新位置
    solr搜索引擎配置使用mongodb作为数据源
    [转]Docker容器可视化监控中心搭建
    AOP缓存实现
  • 原文地址:https://www.cnblogs.com/mrclr/p/8525039.html
Copyright © 2011-2022 走看看