大数乘法除法

反转数组

void reverse(char * c)  
{  
    int len = strlen(c);  
    for(int i=0; i<len/2; i++)  
        swap(c[i],c[len-i-1]);  
}  

乘法模板

void multiplication(char * srca,char * srcb,char * dest)//未翻转 
{  
    int ia,ib,c,  
         na = strlen(srca),  
         nb = strlen(srcb);  
    reverse(srca);  
    reverse(srcb);  

    for(ia=0; ia<na; ia++)  
    {  
        c = 0;  
        for(ib=0; ib<nb; ib++)  
        {  
            int t = (srca[ia]-48) * (srcb[ib]-48) + c,tt;  
            if(dest[ia+ib]>47)  
                tt = dest[ia+ib]-48 + t;  
            else  
                tt = t;  
            dest[ia+ib] = tt%10 +48;  
            c = tt/10;  
        }// for 

        while(c)    //处理进位,直到进位为0 
        {  
            int t;  
            if(dest[ia+ib]>47)  
                t = dest[ia+ib] - 48 + c;  
            else  
                t = c;  
            dest[ia+ib++] = t%10 + 48;  
            c /= 10;  
        }// while 

    }// for 

        //将两个乘数和乘积都改为大端法 
    reverse(dest);    
    reverse(srca);    
    reverse(srcb);    
}  

除法模板

void division(char * src,int n,char * dest)  
{  
    int len = strlen(src),  
        i,              //计数 
        k,              //商的下标 
        t = 0,          //新的余数 
        s = 0;          //余数 
    bool flag = true;   //商是否有了第一个有效位,防止商首部一直出现0 

    for(i=0,k=0; i<len; i++)  
    {  
        t = s*10+(src[i]-48);   //新余数 
        if(t/n>0 || t==0)        //余数为0要修改商 
            dest[k++] = t/n+48,s = t%n,flag = false;  
        else                    //不够除,修改余数 
        {  
            s = t;  
            if(!flag)           //商已经有有效位了,补零 
                dest[k++] = '0';  
        }// if 
    }// for 
    //::memset(src,0,len); 
    //memcpy(src,dest,strlen(dest)); 
}   
    原文作者:大整数乘法问题
    原文地址: https://blog.csdn.net/qq_30591245/article/details/54586455
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞