C语言编程题系列:大数乘法
高精度乘法其实也就是大数乘法,和大数加法一样由于超过了普通数据类型的范围,所以需要使用数组来存储数据和计算,数组计算过程中有以下几个问题需要注意:
- 输入数据时应该用字符串的形式(保证每个元素都是一位数)
- 计算时应该将字符串转换为int型数组方便计算
- 计算过程要注意按位相乘,错位相加,比如123x456计算过程是123x6+123x5x10+123x4x100的结果,这里如果实在看不懂可以在纸上列竖式演算一下,能帮助理解,在代码中利用一个双重for循环就能解决
- 注意处理进位
综上所述,大数乘法的大概思路如下: - 将两个操作数以字符形式输入
- 将操作数转换成int型计算
- 利用循环进行计算和处理进位
- 输出
本程序中的操作并不难,如果事先了解过大数加法的人很容易理解,具体代码如下:
#include <stdio.h>
#include <string.h>
int main()
{
char a[10001],b[10001] ;
int c[10001],d[10001],x[20000]={0};
int i=0,j=0,k=0,max=0,m=0,n=0;
scanf("%s%s",a,b); //以字符串形式将数据输入
for(i=0;i<=strlen(a)-1;i++) //将char转换成int以便计算
{
c[i]=a[i]-'0';
}
for(j=0;j<=strlen(b)-1;j++) //这里没有将两个字符串倒序
{
d[j]=b[j]-'0';
}
m=i;
n=j;
for(i=0;i<m;i++) //两个数组按照数位依次相乘
for(j=0;j<n;j++)
{
x[i+j]+=c[i]*d[j]; //相当于列竖式计算,这里不好描述,最好是自己写个竖式算一下
}
for(i=m+n-1;i>0;i--) //由于上一步循环计算没有对进位进行处理,所以有的数组元素是两位数
{ //这一步处理进位
x[i-1]+=x[i]/10;
x[i]=x[i]%10;
}
for(i=0;i<m+n-1;i++)
{
printf("%d",x[i]);
}
}