zoukankan      html  css  js  c++  java
  • 大整数模拟

    大整数模拟,很常用,记录下。

    1. 加法模拟:

    string res,a,b;

    res = a + b

    string &_string_add_string(const string &a, const string &b, string &res)  
    {  
        int sum_value = 0, add_bit = 0;  
        const int alen = a.length(), blen = b.length();  
        res = "0" + (alen > blen ? a : b);  
        for (int i = alen-1, j = blen-1, k = res.length() - 1;   
             i >= 0 || j >= 0 || add_bit > 0;   
             --i, --j, --k){  
            sum_value = (i>=0 ? a[i]-48: 0) + (j>=0 ? b[j]-48: 0) + add_bit;  
            add_bit = sum_value / 10;   
            res[k] = sum_value%10 + '0';  
        }  
        if (res[0] == '0') res = res.substr(1, res.length() - 1);  
        return res;  
    }  

    2. 减法:

    void sub(char *szLine1, char *szLine2, int nLen1, int nLen2)  
    {  
         int i , j = 0;  
         for( i = nLen1 - 1;i >= 0 ; i --)  
              an1[j++] = szLine1[i] - '0';      
      
         j = 0;  
         for( i = nLen2 - 1;i >= 0 ; i--)  
              an2[j++] = szLine2[i] - '0';  
      
         for( i = 0;i < MAX_LEN ; i ++ )   
         {   
             if(an1[i] >= an2[i]) //逐位相减  
                        an1[i] -= an2[i];              
             else  
             {  
                 an1[i+1]--;  
                 an1[i] += 10;  
                 an1[i] -= an2[i];    
             }   
         }  
      
         bool bStartOutput = false;     //此变量用于跳过多余的0  
         for( i = MAX_LEN; i >= 0; i-- )   
         {  
              if( bStartOutput)      
                  printf("%d", an1[i]);  //如果多余的0已经都跳过,则输出       
              else if( an1[i] ) {             
                   printf("%d", an1[i]);  
                   bStartOutput = true; //碰到第一个非0的值,就说明多余的0已经都跳过                    
              }  
         }  
         if(!bStartOutput)      //结果为0特殊处理   
              printf("0");  
      
    }  


    3.乘法

    依赖于加法

    string res,a,b;

    res = a * b;

    和小学生计算乘法的方法一样

    string &_del_zeros_before_dot(string &a)  
    {  
        if (a.length() <= 0 || a[0] != '0') return a;  
        int i = 0;  
        while (i < a.length() && a[i] == '0') ++i;  
        a = a.substr(i, a.length() - i);  
        return a;  
    }  
      
    string &_string_add_string(const string &a, const string &b, string &res)  
    {  
        int sum_value = 0, add_bit = 0;  
        const int alen = a.length(), blen = b.length();  
        res = "0" + (alen > blen ? a : b);  
        for (int i = alen-1, j = blen-1, k = res.length() - 1;   
             i >= 0 || j >= 0 || add_bit > 0;   
             --i, --j, --k){  
            sum_value = (i>=0 ? a[i]-48: 0) + (j>=0 ? b[j]-48: 0) + add_bit;  
            add_bit = sum_value / 10;   
            res[k] = sum_value%10 + '0';  
        }  
        if (res[0] == '0') res = res.substr(1, res.length() - 1);  
        return res;  
    }  
      
      
    string &_gen_zeros_string(int n, string &res) {  
        string temp = "0";  
        res = "";  
        while (n) {  
            if (n&1) res += temp;  
            temp += temp;  
            n >>= 1;  
        }  
        return res;  
    }  
      
    string &_string_multiply_char(  
        const string &a,   
        char c, int n_zeros, string &res) {  
      
        int ch = c - '0';  
        string zeros_string;  
        _gen_zeros_string(n_zeros, zeros_string);  
        res = "0" + a + zeros_string;  
          
        const int alen = a.length();  
        for (int i = alen - 1, k = alen, add_bit = 0;   
            i >= 0 || add_bit > 0; --i, --k) {  
            int v = (i>=0 ? a[i]-48: 0) * ch + add_bit;  
            add_bit = v / 10;  
            res[k] = v % 10 + '0';  
        }  
        if (res[0] == '0') res = res.substr(1, res.length() - 1);  
      
        return res;  
    }  
      
    string &_string_multiply_string(const string &a, const string &b, string &res) {  
        string c = a, d = b;  
        _del_zeros_before_dot(c);  
        _del_zeros_before_dot(d);  
        int clen = c.length(), dlen = d.length();  
      
        if (clen < dlen) {   
            string t = c; c = d; d = t;  
            int x = clen; clen = dlen; dlen = x;  
        }  
      
        res = "0";  
        for (int i = dlen - 1; i >= 0; --i) {  
            string temp_res;  
            _string_multiply_char(c, d[i], (dlen - 1 - i), temp_res);  
      
            string add_res;  
            _string_add_string(res, temp_res, add_res);  
            res = add_res;  
        }  
        return res;  
    }  
      



    4.除法


    哥不会,没有好的想法

    好像也不常用


    每天早上叫醒你的不是闹钟,而是心中的梦~
  • 相关阅读:
    poj 1579(动态规划初探之记忆化搜索)
    hdu 1133(卡特兰数变形)
    CodeForces 625A Guest From the Past
    CodeForces 625D Finals in arithmetic
    CDOJ 1268 Open the lightings
    HDU 4008 Parent and son
    HDU 4044 GeoDefense
    HDU 4169 UVALive 5741 Wealthy Family
    HDU 3452 Bonsai
    HDU 3586 Information Disturbing
  • 原文地址:https://www.cnblogs.com/vintion/p/4117080.html
Copyright © 2011-2022 走看看