算法提高 P1001
时间限制:1.0s 内存限制:256.0MB
当两个比较大的整数相乘时,可能会出现数据溢出的情形。为避免溢出,可以采用字符串的方法来实现两个大数之间的乘法。具体来说,首先以字符串的形式输入两个整数,每个整数的长度不会超过8位,然后把它们相乘的结果存储在另一个字符串当中(长度不会超过16位),最后把这个字符串打印出来。例如,假设用户输入为:62773417和12345678,则输出结果为:774980393241726.
输入:
62773417 12345678
输出:
774980393241726
#include<stdio.h>
#include<string.h>
char s1[],s2[];
int a1[],a2[],result[];
int l1,l2;
void mul()
{
memset(result,,sizeof(result));
for(int i=; i<l1; i++) //实现乘法
for(int j=; j<l2; j++)
{
result[i+j]+=a1[i]*a2[j];
}
for(int i=; i<l1+l2-; i++) //进位处理
{
result[i+]+=result[i]/;
result[i]%=;
}
if(result[l1+l2-]!=)//注意判断
printf("%d",result[l1+l2-]);
for(int i=l1+l2-; i>=; i--)
printf("%d",result[i]);
// printf("\n");
}
int main()
{
scanf("%s%s",s1,s2);//运用字符串读入
//将各个字符所代表的数按照数字存入数组中
memset(a1,,sizeof(a1));
l1=strlen(s1);
for(int i=; i<l1; i++)
{
a1[l1--i]=s1[i]-'';
}
memset(a2,,sizeof(a2));
l2=strlen(s2);
for(int i=; i<l2; i++)
{
a2[l2--i]=s2[i]-'';
}
if(((l1==)&&(a1[]==))||((l2==)&&(a2[]==)))//注意把至少有一个乘数为0的情况单独拿出来考虑
printf("0\n");
else
mul();
return ;
}