高精度计算
来源:互联网 发布:淘宝股份占比例图 编辑:程序博客网 时间:2024/05/01 21:44
由于编程语言提供的基本数值数据类型表示的数值范围有限,不能满足较大规模的高精度数值计算,因此需要利用其他方法实现高精度数值的计算。实现高精度数值计算,虽然不能利用编程语言提供的基本数值数据类型,但是可以利用字符串存储高精度数,计算的结果同样保存在字符串中,将高精度数运算转化为字符串运算。以下列举出高精度数相关运算。
1.大数加法
/* * 高精度数 * 结果存储在字符串a中,字符串a初始为0 * 计算结束,将字符串a翻转即为高精度数a,b的和 */ void add(char *a, char *b) { strrev(a);strrev(b); //reverse string b int la = strlen(a); //cal the length of a int lb = strlen(b); //cal the length of b int i = 0, j = 0, k = 0, s = 0, inc = 0; while(i < la && j < la) { s = (a[i] & 0XF) + (b[j] & 0XF) + inc; a[k++] = (s % 10) + '0'; //add b to a inc = s / 10; //store the carry i++; j++; } while(i < la) //length of a is greater than b { s = (a[i] & 0XF) + inc; a[k++] = (s % 10) + '0'; inc = s / 10; i++; } while(j < lb) //length of b is greater than a { s = (b[j] & 0XF) + inc; a[k++] = (s % 10) + '0'; inc = s / 10; j++; } if(inc != 0) //at last,if the carry is not 0,store it into a a[k++] = inc + '0'; strrev(a);}
2.大数减法
大数减法相对加法较为复杂,但是只要注意借位操作的正确性,还是能够较为轻松写出正确的大数减法运算的。
//高精度数减法string sub(string num1, string num2){string ans;int *a, *b, i, max, len, len1, len2, k;len1 = num1.length();len2 = num2.length();len = len1;max = len;a = new int[len];b = new int[len];for(i = 0; i <= len - 1; i++){a[i] = 0;b[i] = 0;}k=0;for(i = len1 - 1; i >= 0; i--)a[k++] = num1[i] - '0';k = 0;for(i = len2 - 1; i >= 0; i--)b[k++] = num2[i] - '0';for(i = 0; i <= len - 1; i++){if(a[i] < b[i]){a[i + 1]--;a[i] = a[i] + 10;a[i] = a[i] - b[i];}else a[i] = a[i] - b[i];}while(a[len] == 0 && len > 0 || len >= max) len--;for(i = len; i >= 0; i--) ans.append(1, a[i] + '0');return ans;}
3.大数乘法
大数乘法利用了大数加法的思想,需要注意的是进位的操作。
/* * 返回两个大数相乘的结果 */string multiple(string a, string b){string result = "0", str;int i, j, remain, tmp, m, n;for(i = a.length() - 1; i >= 0; i--){str = "";remain = 0; //at first the carry is 0for(j = b.length() - 1; j >= 0; j--){tmp = (a[i] & 0XF) * (b[j] & 0XF) + remain;remain = tmp / 10; //store the carrystr = (char)(tmp % 10 + '0') + str;}if(remain != 0){str = (char)(remain + '0') + str;}tmp = 0;m = result.length() - (a.length() - i);n = str.length() - 1;remain = 0;while(m >= 0 && n >= 0) //add str to result{tmp = (result[m] & 0XF) + (str[n] & 0XF) + remain;remain = tmp / 10;result[m] = (char)(tmp % 10 + '0');m--; n--;}while(m >= 0){tmp = (result[m] & 0XF) + remain;remain = tmp / 10;result[m] = (char)(tmp % 10 + '0');m--;}while(n >= 0){tmp = (str[n] & 0XF) + remain;remain = tmp / 10;result = (char)(tmp % 10 + '0') + result;n--;}if(remain != 0){result = (char)(remain + '0') + result;}}return result;}
- 高精度计算
- 高精度计算
- 高精度计算
- 高精度计算
- 高精度计算
- 高精度计算
- 高精度计算
- 高精度计算
- 高精度计算
- 高精度计算
- 高精度计算
- 高精度计算
- 高精度计算
- 高精度计算
- 高精度计算
- 高精度计算
- 高精度计算(高精度乘高精度,高精度减高精度)
- noip1998 高精度计算 (高精度)
- Windows Phone 7 网络字节序列化(结构转字节)实现
- java调用oracle存储过程
- 加密,解密
- eclipse相关插件
- Centos5.5最小化安装后的优化
- 高精度计算
- oracle表空间操作详解
- JAVA 经典面试题 不要错过哦
- HTTP 客户端下载
- 黑苹果相关下载
- sqlserver2005添加表 列说明
- 多字节与宽字节之间的转换
- C#多线程学习笔记之(abort与join配合使用)
- 并查集