高精度算法

由于编程语言提供的基本数值数据类型表示的数值范围有限,不能满足较大规模的高精度数值计算,因此需要利用其他方法实现高精度数值的计算。 实现高精度数值计算,虽然不能利用编程语言提供的基本数值数据类型,但是可以利用字符串存储高精度数,计算的结果同样保存在字符串中,将高精度数运算转化为字符串运算。以下列举出高精度数相关运算。

1.大数加法

  1. /*   
  2. * 高精度数  
  3. * 结果存储在字符串a中,字符串a初始为0  
  4. * 计算结束,将字符串a翻转即为高精度数a,b的和  
  5. */    
  6. void add(char *a, char *b)    
  7. {    
  8.     strrev(a);  
  9.     strrev(b);  //reverse string b    
  10.     int la = strlen(a); //cal the length of a    
  11.     int lb = strlen(b); //cal the length of b    
  12.     int i = 0, j = 0, k = 0, s = 0, inc = 0;    
  13.     while(i < la && j < la)    
  14.     {    
  15.             s = (a[i] & 0XF) + (b[j] & 0XF) + inc;    
  16.             a[k++] = (s % 10) + '0'//add b to a    
  17.             inc = s / 10; //store the carry    
  18.             i++; j++;    
  19.     }    
  20.     while(i < la) //length of a is greater than b    
  21.     {    
  22.             s = (a[i] & 0XF) + inc;    
  23.             a[k++] = (s % 10) + '0';    
  24.             inc = s / 10;    
  25.             i++;    
  26.     }    
  27.     while(j < lb) //length of b is greater than a    
  28.     {    
  29.             s = (b[j] & 0XF) + inc;    
  30.             a[k++] = (s % 10) + '0';    
  31.             inc = s / 10;    
  32.             j++;    
  33.     }    
  34.     if(inc != 0) //at last,if the carry is not 0,store it into a    
  35.             a[k++] = inc + '0';    
  36.     strrev(a);  
  37. }  

2.大数减法

大数减法相对加法较为复杂,但是只要注意借位操作的正确性,还是能够较为轻松写出正确的大数减法运算的。

  1. //高精度数减法  
  2. string sub(string num1, string num2)  
  3. {  
  4.     string ans;  
  5.     int *a, *b, i, max, len, len1, len2, k;  
  6.   
  7.     len1 = num1.length();  
  8.     len2 = num2.length();  
  9.     len = len1;  
  10.     max = len;  
  11.     a = new int[len];  
  12.     b = new int[len];  
  13.     for(i = 0; i <= len - 1; i++)  
  14.     {  
  15.         a[i] = 0;  
  16.         b[i] = 0;  
  17.     }  
  18.     k=0;  
  19.     for(i = len1 - 1; i >= 0; i--)  
  20.         a[k++] = num1[i] - '0';  
  21.     k = 0;  
  22.     for(i = len2 - 1; i >= 0; i--)  
  23.         b[k++] = num2[i] - '0';  
  24.     for(i = 0; i <= len - 1; i++)  
  25.     {  
  26.         if(a[i] < b[i])  
  27.         {  
  28.             a[i + 1]--;  
  29.             a[i] = a[i] + 10;  
  30.             a[i] = a[i] - b[i];  
  31.         }  
  32.         else   
  33.             a[i] = a[i] - b[i];  
  34.     }  
  35.     while(a[len] == 0 && len > 0 || len >= max)   
  36.         len--;  
  37.     for(i = len; i >= 0; i--)   
  38.         ans.append(1, a[i] + '0');  
  39.   
  40.     return ans;  
  41. }  

3.大数乘法

        大数乘法利用了大数加法的思想,需要注意的是进位的操作。

  1. /* 
  2.  * 返回两个大数相乘的结果 
  3.  */  
  4. string multiple(string a, string b)  
  5. {  
  6.     string result = "0", str;  
  7.     int i, j, remain, tmp, m, n;  
  8.       
  9.     for(i = a.length() - 1; i >= 0; i--)  
  10.     {  
  11.         str = "";  
  12.         remain = 0; //at first the carry is 0  
  13.         for(j = b.length() - 1; j >= 0; j--)  
  14.         {  
  15.             tmp = (a[i] & 0XF) * (b[j] & 0XF) + remain;  
  16.             remain = tmp / 10;  //store the carry  
  17.             str = (char)(tmp % 10 + '0') + str;  
  18.         }  
  19.         if(remain != 0)  
  20.         {  
  21.             str = (char)(remain + '0') + str;  
  22.         }  
  23.   
  24.         tmp = 0;  
  25.         m = result.length() - (a.length() - i);  
  26.         n = str.length() - 1;  
  27.         remain = 0;  
  28.         while(m >= 0 && n >= 0)   //add str to result  
  29.         {  
  30.             tmp = (result[m] & 0XF) + (str[n] & 0XF) + remain;  
  31.             remain = tmp / 10;  
  32.             result[m] = (char)(tmp % 10 + '0');  
  33.             m--; n--;  
  34.         }  
  35.   
  36.         while(m >= 0)  
  37.         {  
  38.             tmp = (result[m] & 0XF) + remain;  
  39.             remain = tmp / 10;  
  40.             result[m] = (char)(tmp % 10 + '0');  
  41.             m--;  
  42.         }  
  43.   
  44.         while(n >= 0)  
  45.         {  
  46.             tmp = (str[n] & 0XF) + remain;  
  47.             remain = tmp / 10;  
  48.             result = (char)(tmp % 10 + '0') + result;  
  49.             n--;  
  50.         }  
  51.   
  52.         if(remain != 0)  
  53.         {  
  54.             result = (char)(remain + '0') + result;  
  55.         }  
  56.     }  
  57.   
  58.     return result;  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值