高精度乘法

高精度乘法关键代码
//乘法进位:
c[i+j-1]= a[i]*b[j] + x + c[i+j-1];
x = c[i+j-1]/10;
c[i+j-1] %= 10;
高精度乘法。输入两个正整数,求它们的积。
分析

类似加法,可以用竖式求乘法。在做乘法运算时,同样也有进位,同时对每一位进行乘法运算时,必须进行错位相加,如图3、图4。
  分析c数组下标的变化规律,可以写出如下关系式:ci = c’i +c”i +…由此可见,c i跟a[i]b[j]乘积有关,跟上次的进位有关,还跟原c i的值有关,分析下标规律,有c[i+j-1]= a[i]b[j]+ x + c[i+j-1]; x=c[i+j-1]/10 ; c[i+j-1]%=10;

img3.png

img4.png

详细算法如下
#include<iostream>
#include<cstring>
using namespace std;
char a[100]={}, b[100]={};
int a1[100]= {}, a2[100]={}, a3[100]={},la, lb;
int main(){
    cin >> a >>b;
    la = strlen(a);
    lb = strlen(b);
    for (int i = 0; i <= la - 1; i ++){
        a1[la -i] = a[i] - '0';
    }
    for (int i =0; i <= lb- 1; i++){
        a2[lb -i] = b[i] - '0';
    }
    // 做乘法运算
    for (int i = 1; i <= la; i++){  // 乘数 
        int x = 0;
        for (int j = 1;  j<= lb; j++){  // 被乘数 
            a3[i +j -1] = a1[i] * a2[j] + x + a3[i + j - 1];
            x = a3[i + j -1] /10; // 进位
            a3[i+j-1] %= 10; 
        } 
        a3[i+lb] = x; // 最高位的进位 
    } 
    int lc = la + lb;
    while (a3[lc] == 0 && lc >1){ // 去掉多余的0 
        lc--;
    }
    for(int i = lc; i>0; i--){
        cout << a3[i];
    } 
    return 0;
}
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容