高精度加减乘除模板
2014-11-14 13:25
337 查看
<pre name="code" class="cpp">#include<iostream> #include<string> using namespace std; //对位补0 void alignZero(string& s1, string& s2) { while(s1.length() < s2.length()) s1 = '0' + s1; while(s2.length() < s1.length()) s2 = '0' + s2; } //清除高位多余的0 string clearZero(string s) { while(s.length() > 0 && s[0] == '0') s.erase(0,1); return s; } //判断两个字符串的大小,返回S1>S2的布尔值 bool bigger(string s1, string s2) { if(s1.length() > s2.length() ) return true; if(s1.length() == s2.length() && s1>=s2) return true; return false; } /***************加加加加加******************/ /*先对位补0,然后从低位开始,若和大于9,则向高位仅为,最后清除高位多余的0*/ string addition(string s1, string s2) { int i; string result; alignZero(s1,s2); s1 = '0' + s1; //考虑首位可能进位,在首位中增加一个0处理进位 s2 = '0' + s2; for(i=s1.length()-1; i>=0; i--){ s1[i] += s2[i] - '0'; if(s1[i] > '9'){ s1[i] -= 10; s1[i-1]++; } } result = clearZero(s1); return result; } /***************减减减减减******************/ /*对位补0,从低位开始减法,向高位借位,未处理减数大于被减数的情况*/ string substration(string s1, string s2) { int i; string result; alignZero(s1, s2); for(i=s1.length()-1; i>=0; i--){ if(s1[i] < s2[i]){ s1[i-1]--; s1[i] += 10; } s1[i] -= (s2[i] - '0'); } result = clearZero(s1); return result; } /***************乘乘乘乘乘******************/ /*两数其中一个为0,返回0*/ /*从低位开始,多位数乘多位数化简为多位数乘一位数,又化简为加法,字符串加‘0’,然后对乘数每一位上的数字进行对应次数的加法*/ string multiply(string s1, string s2) { if(s1=="0" || s2=="0") return "0"; int i; char c; string result="0"; for(i=s2.length()-1; i>=0; i--){ for(c='1'; c<=s2[i]; c++) result = addition(result, s1); s1 = s1 + '0'; } result = clearZero(result); return result; } /***************除除除除除******************/ string division(string s1, string s2) { int i; string result="", s=""; for(i=0; i<s1.length(); i++){ s = s+s1[i]; result = result + '0'; while(bigger(s,s2)){/*从0-9试商,若相减后余数小于除数,试商结束*/ result[result.length()-1]++; s= substration(s,s2); } } result = clearZero(result); return result; } int main() { string s1,s2; while(cin >> s1){ cin >> s2; cout << "+" << addition(s1,s2)<< endl; cout << "-" << substration(s1,s2)<< endl; cout << "*" << multiply(s1,s2)<< endl; cout << "/" << division(s1,s2)<< endl; cout << endl; } return 0; }
相关文章推荐
- 高精度模板【高精度加减乘除模带负数判定】
- 两非负整数的高精度加减乘除模C++模板
- 大数高精度加减乘除模板
- 【高精度-加减乘除-模板】
- 高精度模板2(带符号压位加减乘除开方封包)
- 高精度模板(带符号的加减乘除开方/压位)
- ACM高精度加减乘除模板
- 高精度abcdefg加减乘除模板。
- 高精度计算模板——棋盘覆盖问题
- 高精度模板
- 模板总结——高精度加法
- codevs 2943 射箭 1--等比数列求和+高精度模板
- 模板----加减乘除
- 高精度模板(From JCVB)
- 高精度运算 加减乘除阶乘幂
- 『程设解体报告』9的统计(含压位高精度模板)、倒数问题、识别条形码,编程珠玑(含o(n)优化)
- 大数(高精度)加减乘除取模
- 大数高精度加减乘除 51nod 1005 大数加法
- 高精度 大数加法 乘法 除法 模板
- 高精度模板