您的位置:首页 > 其它

大数运算之乘法

2009-11-09 15:35 453 查看
/*
*  Author: Leng_que
*  Date: 2009/11/09
*  E-mail: leng_que@yahoo.com.cn
*  Description: a simple arithmetic unit for compute product of two big positive integer.
*/

#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
;
data
= 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
)+unit )/10;
ans[n++] = IToA( (AToI(ans
)+unit)%10 );

if ( ( AToI(ans
)+tens )/10 == 1 )
{
ans[n++] = IToA(( AToI(ans
)+tens )%10);

//循环检测进位
while (true)
{
if ( AToI(ans
) < 9 )
{
ans
+= 1;
break;
}
else
{
ans[n++] = '0';
}
}
}
else
{
ans
+= 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

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: