高精度加减乘除模板

来源:互联网 发布:品茗标书制作软件 编辑:程序博客网 时间:2024/05/01 14:19
<pre name="code" class="cpp">#include<iostream>#include<string>using namespace std;//对位补0void alignZero(string& s1, string& s2){while(s1.length() < s2.length())s1 = '0' + s1;while(s2.length() < s1.length())s2 = '0' + s2;}//清除高位多余的0string 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;}


                                             
0 0