高精度乘法实例

来源:互联网 发布:开淘宝网店怎样找货源 编辑:程序博客网 时间:2024/05/22 02:20

# include<stdio.h>

 # include <string.h>  //调用strlen函数的头文件

int main(void) {

    char a1[250], b1[250];  // 先定义两个字符数组,用于存储两个较多位数的乘数

    int a[250], b[250], c[500] = {0};  //再定义三个数组,前两个用于接收字符数组里的数字各个位的数值,最后一个用于存储最终结果的各个位的数值

    int len1, len2, len;  //前两个分别表示字符数组a1,b1的实际长度,最后一个表示两个字符数组实际长度之和

    scanf("%s%s", a1, b1);  //对两个字符数组进行赋值

    len1 = strlen(a1);  //将字符串a1的长度赋给len1,用于数组的赋值

    len2 = strlen(b1);  //将字符串b1的长度赋给len2,用于数组的赋值

    len = len1 + len2;  //将两字符串实际长度之和赋给len

    for (int i =0; i < len1;i++)   //for循环,实现字符数组a1内数字向数组转移

        a[i] = a1[len1-1-i] -'0';

    /*不过,字符数组内的数字与数组内数字顺序相反,这与乘法原理有关,根据ASCII,字符数组内的数字要转化成实际的数字,就要减去48,因为‘0’ASCII码恰好是48,所以将字符数组元素-‘0’以实现转化 */

    for (int j =0; j < len2; j++)//for循环,实现字符数组b1内数字向数组转移

        b[j] = b1[len1-1-j] -'0';

    for (int i =0; i < len1; i++) //接下来这两个嵌套的for循环便是高精度乘法的核心

        for (int j =0; j < len2; j++){// 此处这短短三步需要结合乘法原理理解,用文字很难表达

            c[i+j] += a[i]*b[j];  //数字的其中一位与另一数字其中一位相乘,先不考虑进位情况

            c[i+j+1] += (c[i+j]) /10;  //除以10的作用便是判断进多少(注意是c[i+j]

            c[i+j] = c[i+j] % 10;  //进位结束以后该数位便只去各位,故将其取余取余数(注意是c[i+j]

        }  //此处第一、第二个式子用+=,原因可根据乘法原理解释,第三个式子无需+=,原因是取该位数总值的个位即可

    if (c[len-1] ==0)  // 此处是判断输出的第一个数位是否为0,若为0,忽略该位数,即总长减去1

        len--;

    for (int i = len-1; i >= 0; i--)// 倒着输出数组内的数字,得到最终结果

        printf("%d", c[i]);

    return0;

}

0 0
原创粉丝点击