当两个比较大的整数相乘时,可能会出现数据溢出的情形。为避免溢出,可以采用字符串的方法来实现两个大数之间的乘法。具体来说,首先以字符串的形式输入两个整数,每个整数的长度不会超过8位,然后把它们相乘的结果存储在另一个字符串当中(长度不会超过16位),最后把这个字符串打印出来。例如,假设用户输入为:62773417和12345678,则输出结果为:774980393241726.
输入:
62773417 12345678
输出:
774980393241726
思路:按照乘法规则相乘即可,需要注意结果为0和首位为0的情况;
例子:两个一位数相乘,结果可能是一位数,也可能是两位数,3*3=9,5*5=25
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 10 //宏定义
int main( )
{
//定义的数组稍微比目标数组大,防止溢出
char a[N],b[N];
int c[2*N]={0};
int i,j;
scanf("%s",a);
scanf("%s",b);
int len1=strlen(a);//求字符串长度
int len2=strlen(b);
//根据乘法运算,从个位开始乘
for(i=len1-1;i>=0;i--)
{
for(j=len2-1;j>=0;j--)
{
c[i+j+1]+=(a[i]-'0')*(b[j]-'0');//数字字符减去‘0’即为对应整数,ASCLL码
if(c[i+j+1]>9)//单位数大于9
{
c[i+j]+=c[i+j+1]/10;//大于10的进给高位
c[i+j+1]%=10;//留下单位
}
}
}
if(0==c[1]&&0==c[0])//乘积为0
{
printf("0");
}
else
{
if(c[0]!=0)//首位为0不用输出,非0安实际输出
printf("%d",c[0]);
for(i=1;i<len1+len2;i++)
printf("%d",c[i]);
}
return 0;
}