小白笔记-高精度乘法(c语言)

用数组实现两数相乘,模拟竖式乘法
步骤:
1.把要进行运算的两个数写入字符数组
2.判断正负性
3.定义两个整型数组将运算数逆序存入
4.进行乘法运算,再用另一个数组存放结果
5.删除前导0(因为N位数乘M位数的结果有两种,即N+M或N+M+1)
6.逆序打印结果

代码如下:

#include<stdio.h>
#include<string.h>

#define MAX 10000 

int main(void){ 
    char a[MAX],b[MAX];	//存放输入
    int ta[MAX],tb[MAX],c[2*MAX];	//存放运算数和结果
    int flaga,flagb;	//判断正负性
	
	//将数组的每个元素都设为0
    memset(ta,0,sizeof(ta));
    memset(tb,0,sizeof(tb));
    memset(c,0,sizeof(c));

    scanf("%s %s",a,b);	//输入运算数

    flaga = flagb = 0;	//为1说明有负号

    if(a[0] == '-'){ 
        strcpy(a,&a[1]);	//删除负号
        flaga = 1;
        }
    if(b[0] == '-'){ 
        strcpy(b,&b[1]);
        flagb = 1;
        }


    if(flaga == 1 && flagb == 0 || flaga == 0 && flagb == 1)	
        printf("-");	

    int lena = strlen(a);
    int lenb = strlen(b);

	//将数值逆序存入数组,便于计算
    for(int i = 0; i < lena; i++) ta[i] = a[lena-i-1] - '0';
    for(int i = 0; i < lenb; i++) tb[i] = b[lenb-i-1] - '0';

	//进行乘法运算
    for(int i = 0; i < lena; i++){ 
        for(int j = 0; j < lenb; j++){ 
            int temp = ta[i]*tb[j]+c[i+j];
            c[i+j] = temp%10;
            c[i+j+1] += temp/10;
            }
        }

    int lenc = lena + lenb;

    for(int i = lenc-1; i >= 0; i--){ 
        if(c[i] == 0 && lenc > 1) lenc--;	//删除前导0
        else break;
        }
	
	//逆序输出结果
    for(int i = lenc - 1; i >= 0; i--)
        printf("%d",c[i]);

    return 0;
}
    原文作者:不太聪明的样子
    原文地址: https://blog.csdn.net/qq_45524140/article/details/105189316
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞