• 高精度乘法


     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;这个式子得以实现。

  • 相关阅读:
    移动 ProgramDataPackage Cache 文件夹
    Visual Studio 2017
    微信小程序 View:flex 布局
    echarts 模拟迁徙
    树莓派3 Windows 10 IoT Core
    Lumia 830 win10m 启用触摸按键
    青岛旅游
    <孤独者生存(小小辛巴投资手记)>读书笔记
    Python.Unix和Linux系统管理指南
    <低风险投资之路>读书笔记
  • 原文地址:https://www.cnblogs.com/peppa/p/8538328.html
Copyright © 2020-2023  润新知