- 浏览: 1656185 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (405)
- C/C++ (16)
- Linux (60)
- Algorithm (41)
- ACM (8)
- Ruby (39)
- Ruby on Rails (6)
- FP (2)
- Java SE (39)
- Java EE (6)
- Spring (11)
- Hibernate (1)
- Struts (1)
- Ajax (5)
- php (2)
- Data/Web Mining (20)
- Search Engine (19)
- NLP (2)
- Machine Learning (23)
- R (0)
- Database (10)
- Data Structure (6)
- Design Pattern (16)
- Hadoop (2)
- Browser (0)
- Firefox plugin/XPCOM (8)
- Eclise development (5)
- Architecture (1)
- Server (1)
- Cache (6)
- Code Generation (3)
- Open Source Tool (5)
- Develope Tools (5)
- 读书笔记 (7)
- 备忘 (4)
- 情感 (4)
- Others (20)
- python (0)
最新评论
-
532870393:
请问下,这本书是基于Hadoop1还是Hadoop2?
Hadoop in Action简单笔记(一) -
dongbiying:
不懂呀。。
十大常用数据结构 -
bing_it:
...
使用Spring MVC HandlerExceptionResolver处理异常 -
一别梦心:
按照上面的执行,文件确实是更新了,但是还是找不到kernel, ...
virtualbox 4.08安装虚机Ubuntu11.04增强功能失败解决方法 -
dsjt:
楼主spring 什么版本,我的3.1 ,xml中配置 < ...
使用Spring MVC HandlerExceptionResolver处理异常
#include <iostream> #include <string> using namespace std; inline int compare(string str1, string str2) { if(str1.size() > str2.size()) //长度长的整数大于长度小的整数 return 1; else if(str1.size() < str2.size()) return -1; else return str1.compare(str2); //若长度相等,从头到尾按位比较,compare函数:相等返回0,大于返回1,小于返回-1 } //高精度加法 string ADD_INT(string str1, string str2) { string MINUS_INT(string str1, string str2); int sign = 1; //sign 为符号位 string str; if(str1[0] == '-') { if(str2[0] == '-') { sign = -1; str = ADD_INT(str1.erase(0, 1), str2.erase(0, 1)); }else { str = MINUS_INT(str2, str1.erase(0, 1)); } }else { if(str2[0] == '-') str = MINUS_INT(str1, str2.erase(0, 1)); else { //把两个整数对齐,短整数前面加0补齐 string::size_type l1, l2; int i; l1 = str1.size(); l2 = str2.size(); if(l1 < l2) { for(i = 1; i <= l2 - l1; i++) str1 = "0" + str1; }else { for(i = 1; i <= l1 - l2; i++) str2 = "0" + str2; } int int1 = 0, int2 = 0; //int2 记录进位 for(i = str1.size() - 1; i >= 0; i--) { int1 = (int(str1[i]) - 48 + int(str2[i]) - 48 + int2) % 10; //48 为 '0' 的ASCII 码 int2 = (int(str1[i]) - 48 + int(str2[i]) - 48 +int2) / 10; str = char(int1 + 48) + str; } if(int2 != 0) str = char(int2 + 48) + str; } } //运算后处理符号位 if((sign == -1) && (str[0] != '0')) str = "-" + str; return str; } //高精度减法 string MINUS_INT(string str1, string str2) { string MULTIPLY_INT(string str1, string str2); int sign = 1; //sign 为符号位 string str; if(str2[0] == '-') str = ADD_INT(str1, str2.erase(0, 1)); else { int res = compare(str1, str2); if(res == 0) return "0"; if(res < 0) { sign = -1; string temp = str1; str1 = str2; str2 = temp; } string::size_type tempint; tempint = str1.size() - str2.size(); for(int i = str2.size() - 1; i >= 0; i--) { if(str1[i + tempint] < str2[i]) { str1[i + tempint - 1] = char(int(str1[i + tempint - 1]) - 1); str = char(str1[i + tempint] - str2[i] + 58) + str; } else str = char(str1[i + tempint] - str2[i] + 48) + str; } for(i = tempint - 1; i >= 0; i--) str = str1[i] + str; } //去除结果中多余的前导0 str.erase(0, str.find_first_not_of('0')); if(str.empty()) str = "0"; if((sign == -1) && (str[0] != '0')) str = "-" + str; return str; } //高精度乘法 string MULTIPLY_INT(string str1, string str2) { int sign = 1; //sign 为符号位 string str; if(str1[0] == '-') { sign *= -1; str1 = str1.erase(0, 1); } if(str2[0] == '-') { sign *= -1; str2 = str2.erase(0, 1); } int i, j; string::size_type l1, l2; l1 = str1.size(); l2 = str2.size(); for(i = l2 - 1; i >= 0; i --) { //实现手工乘法 string tempstr; int int1 = 0, int2 = 0, int3 = int(str2[i]) - 48; if(int3 != 0) { for(j = 1; j <= (int)(l2 - 1 - i); j++) tempstr = "0" + tempstr; for(j = l1 - 1; j >= 0; j--) { int1 = (int3 * (int(str1[j]) - 48) + int2) % 10; int2 = (int3 * (int(str1[j]) - 48) + int2) / 10; tempstr = char(int1 + 48) + tempstr; } if(int2 != 0) tempstr = char(int2 + 48) + tempstr; } str = ADD_INT(str, tempstr); } //去除结果中的前导0 str.erase(0, str.find_first_not_of('0')); if(str.empty()) str = "0"; if((sign == -1) && (str[0] != '0')) str = "-" + str; return str; } //高精度除法 string DIVIDE_INT(string str1, string str2, int flag) { //flag = 1时,返回商; flag = 0时,返回余数 string quotient, residue; //定义商和余数 int sign1 = 1, sign2 = 1; if(str2 == "0") { //判断除数是否为0 quotient = "ERROR!"; residue = "ERROR!"; if(flag == 1) return quotient; else return residue; } if(str1 == "0") { //判断被除数是否为0 quotient = "0"; residue = "0"; } if(str1[0] == '-') { str1 = str1.erase(0, 1); sign1 *= -1; sign2 = -1; } if(str2[0] == '-') { str2 = str2.erase(0, 1); sign1 *= -1; } int res = compare(str1, str2); if(res < 0) { quotient = "0"; residue = str1; }else if(res == 0) { quotient = "1"; residue = "0"; }else { string::size_type l1, l2; l1 = str1.size(); l2 = str2.size(); string tempstr; tempstr.append(str1, 0, l2 - 1); //模拟手工除法 for(int i = l2 - 1; i < l1; i++) { tempstr = tempstr + str1[i]; for(char ch = '9'; ch >= '0'; ch --) { //试商 string str; str = str + ch; if(compare(MULTIPLY_INT(str2, str), tempstr) <= 0) { quotient = quotient + ch; tempstr = MINUS_INT(tempstr, MULTIPLY_INT(str2, str)); break; } } } residue = tempstr; } //去除结果中的前导0 quotient.erase(0, quotient.find_first_not_of('0')); if(quotient.empty()) quotient = "0"; if((sign1 == -1) && (quotient[0] != '0')) quotient = "-" + quotient; if((sign2 == -1) && (residue[0] != '0')) residue = "-" + residue; if(flag == 1) return quotient; else return residue; } //高精度除法,返回商 string DIV_INT(string str1, string str2) { return DIVIDE_INT(str1, str2, 1); } //高精度除法,返回余数 string MOD_INT(string str1, string str2) { return DIVIDE_INT(str1, str2, 0); } int main() { char ch; string s1, s2, res; while(cin >> ch) { cin >> s1 >> s2; switch(ch) { case '+': res = ADD_INT(s1, s2); break; //高精度加法 case '-': res = MINUS_INT(s1, s2); break; //高精度减法 case '*': res = MULTIPLY_INT(s1, s2); break; //高精度乘法 case '/': res = DIV_INT(s1, s2); break; //高精度除法, 返回商 case 'm': res = MOD_INT(s1, s2); break; //高精度除法, 返回余数 default : break; } cout << res << endl; } return(0); }
评论
1 楼
yaojingguo
2010-09-15
Good code. I have written a refined implementation based on your post. http://yaojingguo.iteye.com/blog/764311
发表评论
-
二分查找之变型题目
2010-10-24 12:40 2162二分查找算法在各个公司的笔试面试题大量出现,通常不是简单一眼就 ... -
一道笔试题(创新工厂)解法
2010-10-21 17:44 1861一个帖子http://www.iteye.com/topic/ ... -
[zz]大数据量,海量数据 处理方法总结
2010-08-27 22:24 2276大数据量的问题是很多面试笔试中经常出现的问题,比如baidu ... -
Trie and suffix array
2010-04-13 20:54 1931字典数Trie和后缀数组suffix array是处理字符串操 ... -
金币问题
2009-11-09 08:41 2030今年某公司的笔试题: 一个矩阵地图,每一个元素值代表金币数, ... -
楼梯问题
2009-11-09 08:19 1580hl给我的几道某公司的算法题: 1、 有个 100 级的 ... -
一道考察模拟乘法的题目
2009-11-07 22:37 1425今天hl和我讨论一道题目: 写道 整形数组如a={1,4, ... -
链表归并
2009-11-07 21:40 1043以前gx同学问的某某公司的笔试题,写一下练练(纯手写,没编译过 ... -
找出出现次数超过一半的数字
2009-11-07 21:23 1892hl同学问我一道这个题,想了一种方法,感觉还是不错的,只扫描一 ... -
有道难题以超低分晋级
2009-06-10 11:36 1575有道难题比赛居然晋级了,可以领到一个t-shirt。 -
逆序数/逆序数对
2009-06-09 23:17 3794逆序数是个常遇到的问题,主要有两种解法: O(n^2)的方法: ... -
有道难题topcoder
2009-05-31 23:55 2467今天做了有道topcoder的题目,也是第一次在topcode ... -
百度之星第一场题目
2009-05-31 00:03 3663由于不符合参赛条件,未能参加百度之星,看了题目还挺有意思,把题 ... -
一个对字符串很好的Hash函数ELFHHash
2009-05-03 21:41 2286#include<stdio.h> #defin ... -
最大流Ford-Fulkerson算法
2009-04-22 17:33 9700算法导论对最大流算法有很详细的介绍,今天实现了最大流Ford- ... -
带重复数字的全排列
2009-04-16 18:58 3904上次gx同学问我一道又重复数字的全排列的问题,我当时用set保 ... -
差分约束系统
2009-04-15 16:00 3759(本文假设读者已经有以下知识:最短路径的基本性质、Bellma ... -
二分图匹配
2009-04-15 15:40 3734二分图最大匹配的匈牙利算法 二分图是这样一个图,它的顶点可以分 ... -
线段树
2009-03-24 10:58 1690把问题简化一下: 在自然数,且所有的数不大于30000的 ... -
树状数组
2009-03-24 10:39 2355树状数组是一种非常优雅的数据结构. 当要频繁的对数 ...
相关推荐
高精度加法算法是计算机科学中处理大整数或大数运算的一种技术,它涉及到的主要是如何处理超出标准数据类型(如整型、浮点型)表示范围的数字。在处理这种运算时,通常需要自定义数据结构和算法来存储和操作这些大数...
大数的加减乘除操作都是基于这种位数组进行的。简略版通常会提供基本的运算符重载,如`+`、`-`、`*`、`/`,并使用简单而直观的算法实现这些操作。例如,加法可能通过逐位相加并考虑进位来完成,乘法则可能使用...
GNU MP 是一个强大的开源大数高精度运算库,它提供了在各种编程语言中进行大整数和浮点数计算的能力。这个库被广泛用于需要处理超过标准整型或浮点型所能表示数值范围的场景,比如加密算法、科学计算、金融分析以及...
在使用高精度计算库时,开发者可以利用库提供的API(Application Programming Interface)来执行加减乘除、取模、幂运算、开方、求根等操作。这些API通常会设计得易于理解和使用,使得开发人员无需关心底层复杂的...
这些库通常提供包括加减乘除、取模、比较、位操作等在内的各种大数运算功能,并且支持动态增长的大数表示。 1. **原理与数据结构**:大数运算库通常采用链表或者数组来存储大数的每一位,每一位可以是一个较小的...
这样的设计使得计算器能够处理从简单加减乘除到更复杂的根号、指数、对数等运算,且不损失精度。 在VB中实现高精度计算,首先要理解VB的数据类型系统。VB的Integer和Long类型虽然可以表示较大的整数,但仍有其局限...
它实现了无限制长度的整数类型`mpz_t`,允许进行加减乘除、取模、指数运算、位操作等基本数学运算。此外,GMP还提供了浮点数类型`mpf_t`,支持高精度的浮点数计算。这些类型能够处理比系统原生类型大得多的数值,且...
在执行加减乘除等基本运算时,高精度算法需要考虑到进位和借位的问题。例如,加法通常采用“学校教的”竖式加法方法,逐位相加并处理进位;乘法可以使用Karatsuba算法或更高效的FFT(快速傅里叶变换)方法;除法则...
TOMMATH提供了完整的API,支持大数的加减乘除、比较、取模、平方根等操作,以及一些高级函数,如素数测试和模逆运算。使用这样的库可以简化开发者在C语言环境中实现大数运算的复杂性。 “ltm-0.39.zip”是...
这个类提供了一系列方法,用于执行包括加减乘除、取模在内的各种大数运算。例如,我们可以使用`BigInteger`的`divide`方法来进行除法运算,`mod`方法来进行取模运算。这两个方法允许我们处理任意大小的整数,不受...
1. 大整数运算:支持大整数的加减乘除、乘方、取模等基本运算,以及位操作,如左移、右移、按位与、按位或、按位异或等。 2. 高精度浮点数运算:提供高精度的浮点数计算,可以处理标准浮点数无法精确表示的数值,...
例如,`BigInt`类可能会重载`+`、`-`、`*`、`/`等操作符,以便进行加减乘除。此外,可能还会重载比较操作符如`、`>`、`==`等,用于大整数之间的比较。 1. **重载加法运算符**:这通常涉及到两个`BigInt`对象的逐位...
本题目的核心就是通过字符串操作来解决大数的加减乘除和取模运算。 1. **大数表示**: 在给定的代码中,大数被定义为一个结构体`Num`,包含一个字符数组`num`用于存储大数的每一位,以及一个整型变量`len`表示大数...
除了基本的运算功能,大数计算器通常还包含其他高级特性,如大数的加减乘除、因数分解、模逆元查找等。这些功能在处理复杂的数学问题,如数论问题、图论问题,甚至是物理模拟中都有广泛应用。 在实际使用中,大数...
Java提供了一个名为`java.math.BigInteger`的类,用于执行任意精度的算术运算,包括加减乘除、取模以及复杂的数学运算。这个类允许我们在程序中处理任意大小的整数,无论是正数、负数还是零。 首先,让我们了解一下...
它支持所有的整数算术运算,包括加减乘除、取模、位操作等。在示例1中,展示了如何使用`BigInteger`计算组合数C(n, k)。这里,`BigInteger.valueOf()`方法用于将整数转换为`BigInteger`对象,然后通过`multiply()`和...
在BigNumVB库中,大数被表示为一个内部结构,可以通过API调用来创建、初始化、比较、加减乘除以及执行其他数学运算。例如,你可以使用`NewBigInt`函数创建一个新的大数对象,使用`Add`函数进行加法运算,`Subtract`...
3. **编写代码**:使用GMP提供的API进行大数运算,例如初始化大数、分配内存、进行加减乘除等操作。 4. **测试和优化**:编写测试用例验证算法的正确性,并根据性能需求考虑优化策略,比如选择更适合当前任务的算法...
1. **大整数操作**:支持大整数的加减乘除、幂运算、取模、位操作等,适用于处理超过Python内置`int`类型范围的数字。 2. **浮点数运算**:提供高精度浮点数计算,可以设置任意精度,确保计算结果的准确性。 3. **...
这些数据结构能够容纳任意长度的位序列,从而实现大整数的加减乘除、取模等基本运算。例如,可以使用一个动态分配的数组来存储每一位数字,数组的大小可以根据需要动态扩展。 在设计高精度计算库时,首先要考虑的是...