//大整数乘法
//算法思想:
//1.以字符串形式接收大数 , 转换成整型数组
// 转换过程说明(字符数组四位对应整型数组一位 ,整型数组低位保存大数的低位)
// e.g 输入 s = 123456789 转换成整型数组 a[1000]
// a[0] 保存整型数组长度(此例为3) , a[1] = 6789 ; a[2] = 2345 ; a[3] = 1 ;
//2.每次从乘数中选一位,与被乘数的各位相乘,结果保存在result[i+j-1];
//3.处理进位 , 处理长度
//4. 输出,此过程要考虑两种情况: 一,最后为0 ,输出0 (处理不当,会输出0000)
// 二,中间为0 ,1...
//e.g : result[1] = 11; result[2] = 12 ; result[3] = 1111;
//输出结果应该是 1100121111 , 处理不当会出现 11121111 错误
//2009.8.9
#include <iostream>
#include <string>
#include <cmath> //ceil 向上取整 floor 向下取整
using namespace std;
const double SIZE = 4.0;
int SIGN = 0; //符号位
void Inti (string &ss1 , int s1[])
{
//符号位处理
if (*ss1.begin() == '-')
{
SIGN++;
ss1.assign(ss1 , 1 , ss1.length() - 1); //删除负号
}
//向上取整,取整型数组长度
s1[0] = ceil (ss1.length() / SIZE) ;
int j = ss1.length() - 1;
for (int i = 1 ; i <= s1[0] ; i++)
{
int k = 0 , m = 1;
while (j >= 0)
{
s1[i] += (ss1[j] - '0') * m;
m *= 10; k++; j--;
if (k == SIZE) break;
}
}
}
//相乘函数
void Multipication (int s1[] , int s2[] , int s3[])
{
//粗略估计结果长度
s3[0] = s2[0] + s1[0];
//相乘过程 ,处理进位
//之前写的是大数相乘后,在重新扫描一遍处理进位,
//经过 fx397993401 的提醒,改成在相乘的同时处理进位
int flag = 0;
for (int i = 1; i <= s1[0]; i++)
for (int j = 1; j <= s2[0]; j++)
{
int k = i + j - 1;
s3[k] += (s1[i] * s2[j] + flag);
if (s3[k] > 9999)
{
flag = s3[k] / 10000;
s3[k] %= 10000;
}
else flag = 0;
}
//处理长度
for (i = s3[0]; i > 0; i--)
{
if (s3[i] == 0) s3[0]--;
else break;
}
//输出处理
if (SIGN == 1) //处理符号
cout<<"-";
i = s3[0];
if (i == 0) //处理为0结果
cout<<"0"<<endl;
else
{
for (; i > 0; i--)
{
if (i == s3[0])
printf ("%d" , s3[i]);
else
printf ("%04d",s3[i]);
}
cout<<endl;
}
SIGN = 0;
}
//主函数
int main()
{
while (1)
{
string ss1 , ss2;
cin>>ss1>>ss2;
int s1[1000] = {0}, s2[1000] = {0};
int result[1000] = {0};
Inti (ss1 , s1); Inti (ss2 , s2);
Multipication (s1 , s2 , result);
}
return 0;
}