大数相乘

 

char   *  mutiply( const   char   *  num1, const   char   *  num2)
{
    
int len1 = strlen(num1);
    
int len2 = strlen(num2);

    
static char result[MAX_NUM*2];
    memset(result,
'0',MAX_NUM*2);

    
char mid[2]={0,0};//保存两个个位数相乘的结果,mid[0]存放十位数,mid[1]存放个位数
    
int sign=0; //进位
    
int sign2=0; //进位

    
for (int j=1;j<=len2;j++)
    
{
        
for (int i=1;i<=len1;i++)
        
{
            
int tmp = (num1[len1-i]-'0')*(num2[len2-j]-'0');
            mid[
1]=tmp%10;
            mid[
0]=(int)tmp/10;
               int pos = MAX_NUM*2 - 1 - ( (i-1) +(j-1) );

            sign 
=   int (((result[pos ] + mid[ 1 ]) - ' 0 ' ) / 10 ); //求个位相加进位,有则为1,无则为0

            result[pos ] = ' 0 ' + (result[pos ] + mid[ 1 ] - ' 0 ' ) % 10 ; //把个位数加到结果去
              
               sign2  =  ( int )((result[pos - 1 ] + sign + mid[ 0 ] - ' 0 ' ) / 10 ); //求十位相加进位,有则为1,无则为0

            result[pos - 1 =   ' 0 ' + (result[pos - 1 ] + sign + mid[ 0 ] - ' 0 ' ) % 10 ; //把十位数加到结果去
               //依次检查进位,直到没有进位为止
            
for  ( int  k = 1 ;sign2;k ++ )
            
{
                sign 
=(int) ((result[pos - 1 - k]+sign2-'0')/10);
                result[pos - 1 - k
= '0'+(result[pos - 1 - k]+sign2-'0')%10;
                sign2 
= sign;
            }

        }

    }

    
int  i = 0 ;
    
for (;result[i] == ' 0 ' ;i ++ )
        ;
    
return  result + i;

}

            
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值