大数模板

    今天老师安排了大数处理的专题训练,这个大数处理自己原本做的就很少,所以自己AC的速度就很慢啦。做大数的模板分两种,一种是c++的,一种是Java的


c++:

加法

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] = '\0';
    for( i=0, --j; i < j; ++i, --j )
    {
        ch = str3[i];
        str3[i] = 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] = '\0';
    for( i=0, --j; i < j; ++i, --j )
    {
        ch = str3[i];
        str3[i] = 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] = '\0';
    for( i=0, --j; i < j; ++i, --j )
    {
        ch = str3[i];
        str3[i] = 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[i] > str2[i] ) break;
                else if( d[i] < str2[i] )
                {
                    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[i] < str2[i2] )
                    {
                        cf = 0;
                        break;
                    }
                    else if( d[i] > str2[i2] )
                    {
                        break;
                    }
                    ++i2;
                }
            }//else
            while( cf )
            {
                i2 = len2-1;
                cf = 0;
                for( i=lend-1; i >= lend-len2; --i )
                {
                    d[i] = d[i]-str2[i2]+'0';
                    if( d[i] < '0' )
                    {
                        d[i] = d[i]+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[i] < str2[i2] )
                        {
                            cf = 0;
                            break;
                        }
                        else if( d[i] > str2[i2] )
                        {
                            break;
                        }
                        ++i2;
                    }
                }//else
            }//while
            jj = 0;
            while( d[jj] <= '0' && jj < lend ) ++jj;
            for( i=0; i < lend-jj; ++i ) d[i] = d[i+jj];
            d[i] = str1[i1+1];
            lend = i+1;
            ++j;
        }//else
    }//for
    i = tag = 0;
    while( c[i] == 0 ) ++i;
    for( ; i < j; ++i, ++tag ) str3[tag] = c[i]+'0';
    str3[tag] = '\0';

    int cmp(char *t,char *a)
    {
        int len1=strlen(t);
        int len2=strlen(a);
        if(len1>len2)
            return 1;
        else if(len1<len2)
            return -1;
        else
            return strcmp(t,a);
    }
}

Java:

    import java.util.Scanner;  
    import java.math.*;  
    import java.text.*;  
    public class Main {  
        public static void main(String args[]) {  
           Scanner cin = new Scanner ( System.in );  
           BigInteger a,b;  
           int c;  
           char op;  
           String s;  
            
           while( cin.hasNext() ) {  
                a = cin.nextBigInteger();  
                s = cin.next();  
                op = s.charAt(0);  
                if( op == '+') {  
                    b = cin.nextBigInteger();  
                    System.out.println(a.add(b));  
                }  
                else if( op == '-') {  
                    b = cin.nextBigInteger();  
                    System.out.println(a.subtract(b));  
                }  
                else if( op == '*') {  
                    b = cin.nextBigInteger();  
                    System.out.println(a.multiply(b));  
                }  
                else {  
                    BigDecimal a1,b1,eps;  
                    String s1,s2,temp;  
                    s1 = a.toString();  
                    a1 = new BigDecimal(s1);  
                    b = cin.nextBigInteger();  
                    s2 = b.toString();  
                    b1 = new BigDecimal(s2);  
                    c = cin.nextInt();  
                    eps = a1.divide(b1,c,4);  
                    //System.out.println(a + " " + b + " " + c);  
                    //System.out.println(a1.doubleValue() + " " + b1.doubleValue() + " " + c);  
                    System.out.print( a.divide(b) + " " + a.mod(b) + " ");  
                    if( c != 0) {  
                        temp = "0.";  
                        for(int i = 0; i < c; i ++) temp += "0";  
                        ecimalFormat gd = new DecimalFormat(temp);  
                        System.out.println(gd.format(eps));  
                    }  
                    else System.out.println(eps);  
                }  
            }  
        }  
    }  


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值