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.除法


    哥不会,没有好的想法

    好像也不常用


    每天早上叫醒你的不是闹钟,而是心中的梦~
  • 相关阅读:
    Day 09 文件处理
    Day 08 字符编码
    day 07 猜年龄
    Day 07 元组/字典/集合/python深浅拷贝
    Day 06 猜年龄/三级菜单
    并发编程-Atomic的compareAndSet
    并发编程-多线程共享变量不安全
    Spring boot Junit单元测试回滚
    Java 不区分大小写比较字符串
    IDEA 设置html 和js热发布
  • 原文地址:https://www.cnblogs.com/vintion/p/4117080.html
Copyright © 2011-2022 走看看