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

     1 #include<cstdio>
     2 #include<algorithm>
     3 #include<iostream>
     4 #include<cmath>
     5 #include<cstring>
     6 using namespace std;
     7 int main()
     8 {
     9     char a[100005],b[100005];
    10     int aa[100005],bb[100005],cc[100005],lena,lenb,lenc,i,j,x;
    11     memset(aa,0,sizeof(aa));
    12     memset(bb,0,sizeof(bb));
    13     memset(cc,0,sizeof(cc));
    14     gets(a);
    15     gets(b);
    16     lena = strlen(a);
    17     lenb = strlen(b);
    18     for(i = 0;i <= lena - 1;i++)
    19         aa[lena - i] = a[i] - 48;
    20     for(i = 0;i <= lenb - 1;i++)
    21         bb[lenb - i] = b[i] - 48;
    22     for(i = 1;i <= lena;i++)//设立内外层循环依次枚举一个乘数的一个数字和另一个乘数的每一个数字相乘。
    23     {
    24         x = 0;
    25         for(j = 1;j <= lenb;j++)
    26         {
    27             cc[i + j - 1] = aa[i] * bb[j] + cc[i + j - 1] + x;
    28             x = cc[i + j - 1] / 10;//进位
    29             cc[i + j - 1] %= 10;
    30         }
    31         cc[i+lenb] = x;//最前面的数字的进位
    32     }
    33     lenc = lena + lenb;
    34     while(cc[lenc] == 0 && lenc > 1) lenc--;//清除首位0
    35     for(i = lenc;i >= 1;i--)printf("%d",cc[i]);
    36     return 037 }

    我们知道,当列一个乘法竖式时,使一个乘数的一个数字和另一个乘数的一个数字相乘,将得到的结果放在它相应的“等待相加”的位置。而这个“等待相加”的位置每一行依次往前“挪”,而现在我们把原本“第二行”记录的结果直接加到“第一行”中,再加上后一个数字向前的进位,更新了当前位置的数字值。通过cc[i + j - 1] = aa[i] * bb[j] + cc[i + j - 1] + x;这个式子得以实现。

  • 相关阅读:
    echarts折线图
    利用echarts制作词云
    本周总结
    本周总结
    云服务器项目数据库连接超时问题解决
    iOS下载图片失败
    解决后台json数据返回的字段需要替换的问题
    设置User Agent
    Xcode升级到9.3之后pod问题
    gitLab创建自己的私有库
  • 原文地址:https://www.cnblogs.com/peppa/p/8538328.html
Copyright © 2011-2022 走看看