高精度模板(转载)
来源:互联网 发布:网络远程教育报考 编辑:程序博客网 时间:2024/05/05 02:09
高精度计算模板
注意:减法、除法要用到compare函数
乘法
除法
注意:减法、除法要用到compare函数
乘法需要加法的部分,加法需要减法部分
//开头
#include <iostream>#include <string>using namespace std;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);}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);}加法- -
//高精度加法string ADD_INT(string str1, string str2){ string MINUS_INT(string str1, string str2); int sign = 1; 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 { string::size_type l1, l2; int i; l1 = str1.size(); l2 = str2.size(); if(l1 < l2) { for(i = 1; i <= (int)(l2 - l1); i++) str1 = "0" + str1; }else { for(i = 1; i <= (int)(l1 - l2); i++) str2 = "0" + str2; } int int1 = 0, int2 = 0; for(i = str1.size() - 1; i >= 0; i--) { int1 = (int(str1[i]) - 48 + int(str2[i]) - 48 + int2) %10; 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 i,sign = 1; 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; 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, i; 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(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);}
0 0
- 高精度模板(转载)
- 高精度冪(模板)
- 高精度模板(大数)
- 高精度(模板)
- 高精度模板(压位版)
- 高精度模板(乘法)
- 高精度模板(减法)
- 高精度类(刘如佳模板)
- 大数高精度运算(模板)
- 大数(相加,高精度)模板
- 【模板】高精度(加减乘)
- 高精度模板
- 高精度模板
- 高精度模板
- 高精度模板
- 高精度模板
- 高精度模板
- 高精度模板
- web.xml中 servlet 和servlet-mapping的排放顺序
- ACO
- 日本银发经济科技范儿十足
- HOJ 1485 A Good Helper
- Linux信号实践(4) --可靠信号
- 高精度模板(转载)
- HDU 2191 悼念512汶川大地震遇难同胞——珍惜现在,感恩生活
- 使用makefile编译nodejs模块
- HDU 5074 Hatsune Miku (线性dp)
- Codeforces Round #292 (Div. 2)
- 1031_查验身份证(15)
- hdu 2680 Choose the best route 大年三十的首A 赤裸裸的Dijkstra 做这题需要一个小技巧
- (ZT)Notes on Implementing an OLE Control Container
- 只有养老机器人才能拯救未来“老龄化中国”