#include <iostream>
using namespace std;
void reverse(char* data)
{
char tmp=0;
int len = strlen(data);
int n_end = int(len/2);
for ( int n=0; n<n_end; ++n )
{
tmp = data[n];
data[n] = data[len-n-1];
data[len-n-1] = tmp;
}
}
#define IToA(x) (x+48)
#define AToI(x) (x-48)
#define M 512 //乘积结果的位数最大值。注:该值应不小于len_a+len_b+1。
void muli(char* a, char* b)
{
int len_a = strlen(a);
int len_b = strlen(b);
int len = len_a+len_b;
if ( len+1 > M )
{
cout<<"保存结果的缓冲区不足……"<<endl;
return ;
}
reverse(a);
reverse(b);
char ans[M]={0};
memset((void*)ans, '0', len);
int i,j;
int tens,unit;
int n,mul;
for ( i=0; i<len_a; ++i )
{
for ( j=0; j<len_b; ++j )
{
n = i+j;
mul = AToI(a[i]) * AToI(b[j]);
tens = mul/10;
unit = mul%10;
//这里考虑到可能有进位
tens += ( AToI(ans[n])+unit )/10;
ans[n++] = IToA( (AToI(ans[n])+unit)%10 );
if ( ( AToI(ans[n])+tens )/10 == 1 )
{
ans[n++] = IToA(( AToI(ans[n])+tens )%10);
//循环检测进位
while (true)
{
if ( AToI(ans[n]) < 9 )
{
ans[n] += 1;
break;
}
else
{
ans[n++] = '0';
}
}
}
else
{
ans[n] += tens;
}
}
}
if ( ans[len-1] == '0' )
{
ans[len-1] = 0;
}
reverse(ans);
cout<<ans<<endl;
}
#undef IToA
#undef AToI
#undef M
//主函数
int main()
{
char a[]="999999999999999999999999999999999999999999999999999999999999999999123";
char b[]="999999999999999999999999999999999999999999999999999999999999999999777";
muli(a, b);
return 0;
}
程序运行结果:
999999999999999999999999999999999999999999999999999999999999999998900000000000000000000000000000000000000000000000000000000000000000195571