zoukankan      html  css  js  c++  java
  • 普通大数运算模板

    const int MAXSIZE = 200; 
    void Add(char *str1, char *str2, char *str3); 
    void Minus(char *str1, char *str2, char *str3); 
    void Mul(char *str1, char *str2, char *str3); 
    void Div(char *str1, char *str2, char *str3); 
    int main(void)
    char str1[MAXSIZE], str2[MAXSIZE], str3[MAXSIZE]; 
    while( scanf("%s %s", str1, str2) == 2 )
        if( strcmp(str1, "0") )
        { 
            memset(str3, '0', sizeof(str3)); // !!!!!
            Add(str1, str2, str3); 
            printf("%s ", str3); 
            memset(str3, '0', sizeof(str3)); 
            Minus(str1, str2, str3); 
            printf("%s ", str3); 
            memset(str3, '0', sizeof(str3)); 
            Mul(str1, str2, str3); 
            printf("%s ", str3); 
            memset(str3, '0', sizeof(str3)); 
            Div(str1, str2, str3); 
            printf("%s ", str3); 
        } 
        else
        { 
            if( strcmp(str2, "0") ) 
            printf("%s -%s 0 0 ", str2, str2); 
            else printf("0 0 0 0 "); 
        } 
    return 0; 

    加法


    void Add(char *str1, char *str2, char *str3)
    {// str3 = str1 + str2;
        int i, j, i1, i2, tmp, carry;
        int len1 = strlen(str1), len2 = strlen(str2);
        char ch;
        i1 = len1-1; i2 = len2-1;
        j = carry = 0;
        for( ; i1 >= 0 && i2 >= 0; ++j, --i1, --i2 )
        {
            tmp = str1[i1]-'0'+str2[i2]-'0'+carry;
            carry = tmp/10;
            str3[j] = tmp%10+'0';
        }
        while( i1 >= 0 )
        {
            tmp = str1[i1--]-'0'+carry;
            carry = tmp/10;
            str3[j++] = tmp%10+'0';
        }
        while( i2 >= 0 )
        {
            tmp = str2[i2--]-'0'+carry;
            carry = tmp/10;
            str3[j++] = tmp%10+'0';
        }
        if( carry ) str3[j++] = carry+'0';
        str3[j] = '';
        for( i=0, --j; i < j; ++i, --j )
        {
            ch = str3; str3 = str3[j]; str3[j] = ch;
        }
    }

    减法:
     
    void Minus(char *str1, char *str2, char *str3)
    {// str3 = str1-str2 (str1 > str2)
        int i, j, i1, i2, tmp, carry;
        int len1 = strlen(str1), len2 = strlen(str2);
        char ch;
        i1 = len1-1; i2 = len2-1;
        j = carry = 0;
        while( i2 >= 0 )
        {
            tmp = str1[i1]-str2[i2]-carry;
            if( tmp < 0 )
            {
                str3[j] = tmp+10+'0'; carry = 1;
            }
            else
            {
                str3[j] = tmp+'0'; carry = 0;
            }
            --i1; --i2; ++j;
        }
        while( i1 >= 0 )
        {
            tmp = str1[i1]-'0'-carry;
            if( tmp < 0 ) 
            {
                str3[j] = tmp+10+'0'; carry = 1;
            }
            else
            {
                str3[j] = tmp+'0'; carry = 0;
            }
            --i1; ++j;
        }
        --j;
        while( str3[j] == '0' && j > 0 ) --j;
        str3[++j] = '';
        for( i=0, --j; i < j; ++i, --j )
        {
            ch = str3; str3 = str3[j]; str3[j] = ch;
        }
    }

    乘法:
     
     
    void Mul(char *str1, char *str2, char *str3)
    {
        int i, j, i1, i2, tmp, carry, jj;
        int len1 = strlen(str1), len2 = strlen(str2);
        char ch;
        jj = carry = 0;
        for( i1=len1-1; i1 >= 0; --i1 )
        {
            j = jj;
            for( i2=len2-1; i2 >= 0; --i2, ++j )
            {
                tmp =
                (str3[j]-'0')+(str1[i1]-'0')*(str2[i2]-'0')+carry;
                if( tmp > 9 )
                {
                carry = tmp/10; str3[j] = tmp%10+'0';
                }
                else 
                {
                str3[j] = tmp+'0'; carry = 0;
                }
            }
            if( carry ) 
            {
            str3[j] = carry+'0'; carry = 0; ++j;
            }
            ++jj;
        }
        --j;
        while( str3[j] == '0' && j > 0 ) --j;
        str3[++j] = '';
        for( i=0, --j; i < j; ++i, --j )
        {
        ch = str3; str3 = str3[j]; str3[j] = ch;
        }
    }


    除法 :

    void Div(char *str1, char *str2, char *str3)
    {
        int i1, i2, i, j, jj, tag, carry, cf , c[MAXSIZE];
        int len1 = strlen(str1), len2 = strlen(str2), lend;
        char d[MAXSIZE];
        memset(c, 0, sizeof(c));
        memcpy(d, str1, len2);
        lend = len2; j = 0;
        for( i1=len2-1; i1 < len1; ++i1 )
        {
            if( lend < len2 )
            {
                d[lend] = str1[i1+1]; c[j] = 0;
                ++j; ++lend;
            }
            else if( lend == len2 )
            {
                jj = 1;
                for( i=0; i < lend; ++i )
                {
                    if( d > str2 ) break;
                    else if( d < str2 )
                    {
                    jj = 0; break;
                    }
                }
                if( jj == 0 )
                {
                    d[lend] = str1[i1+1]; c[j] = 0;
                    ++j; ++lend;
                    continue;
                }
            }
            if( jj==1 || lend > len2 ){
                cf = jj=0;
                while( d[jj] <= '0' && jj < lend ) ++jj;
                if( lend-jj > len2 ) cf = 1;
                else if( lend-jj < len2 ) cf = 0;
                else
                {
                    i2 = 0; cf = 1;
                    for( i=jj; i < lend; ++i )
                    {
                        if( d < str2[i2] )
                        {
                            cf = 0; break;
                        }
                        else if( d > str2[i2] )
                        {
                        break;
                        }
                        ++i2;
                    }
                }//else
                while( cf )
                {
                    i2 = len2-1; cf = 0;
                    for( i=lend-1; i >= lend-len2; --i )
                    {
                        d = d-str2[i2]+'0';
                        if( d < '0' )
                        {
                            d = d+10; carry = 1;
                            --d[i-1];
                        }
                        else carry = 0;
                        --i2;
                    }
                    ++c[j]; jj=0;
                    while( d[jj] <= '0' && jj < lend ) ++jj;
                    if( lend-jj > len2 ) cf = 1;
                    else if( lend-jj < len2 ) cf = 0;
                    else
                    {
                        i2 = 0; cf = 1;
                        for( i=jj; i < lend; ++i )
                        {
                            if( d < str2[i2] )
                            {
                            cf = 0; break;
                            }
                            else if( d > str2[i2] )
                            {
                            break;
                            }
                            ++i2;
                        }
                    }//else
                }//while
                jj = 0;
                while( d[jj] <= '0' && jj < lend ) ++jj;
                for( i=0;i < lend-jj; ++i ) d = d[i+jj];
                d = str1[i1+1]; lend = i+1;
                ++j;
            }//else
        }//for
        i = tag = 0;
        while( c == 0 ) ++i;
        for( ; i < j; ++i, ++tag ) str3[tag] = c+'0';
        str3[tag] = '';
    } 
  • 相关阅读:
    回首2016,展望2017
    认识多线程
    对CloseHandle用法的理解
    CDC、HDC、pDC之间的关系
    兼容位图和兼容DC的理解
    窗口中显示bmp图片的过程
    创建一个bmp格式的简单方法
    说明为什么Button控件不能使用CustomDraw技术
    MFC自绘Button按钮分析和实现
    VC之美化界面篇
  • 原文地址:https://www.cnblogs.com/CKboss/p/3350995.html
Copyright © 2011-2022 走看看