标签:style blog io ar color os 使用 sp for
数值计算之高精度加减乘除
一. 高精度正整数的高精度计算
1.加法
2.减法
减法和加法的最大区别在于:减法是从高位开始相减,而加法是从低位开始相加
3.乘法:用高精度加法实现
l 乘法的主要思想是把乘法转化为加法进行运算。请先看下面的等式:
12345*4=12345+12345+12345+12345
12345*20=123450*2
12345*24=12345*20+12345*4
l 等式(1)说明,多位数乘一位数,可以直接使用加法完成。
l 等式(2)说明,多位数乘形如d*10n的数,可以转换成多位数乘一位数来处理。
l 等式(3)说明,多位数乘多位数,可以转换为若干个“多位数乘形如d*10n的数与多位数乘一位数”之和。
l 因此,多位数乘多位数最终可以全部用加法来实现。
4.除法:用高精度减法实现
二. 注意清零和对位操作
三. 代码
1 // 2 // main.cpp 3 // 正整数高精度运算 4 // 5 // Created by ashley on 14-11-9. 6 // Copyright (c) 2014年 ashley. All rights reserved. 7 // 8 9 #include <iostream> 10 #include <string> 11 using namespace std; 12 13 string clearZeros(string data) 14 { 15 if (data[0] == ‘0‘) { 16 int key = (int) data.length() - 1; 17 for (int i = 0; i < data.length(); i++) { 18 if (data[i] != ‘0‘) { 19 key = i; 20 break; 21 } 22 } 23 data.erase(0, key); 24 } 25 if (data == "") { 26 data = "0"; 27 } 28 return data; 29 } 30 31 //对位操作 32 void countPoint(string &operand1, string &operand2) 33 { 34 while (operand1.length() < operand2.length()) { 35 operand1 = "0" + operand1; 36 } 37 while (operand1.length() > operand2.length()) { 38 operand2 = "0" + operand2; 39 } 40 } 41 42 //判断大小 43 bool bigger(string operand1, string operand2) 44 { 45 return operand1 >= operand2; 46 } 47 48 string addition(string addent, string adder) 49 { 50 //先对位,在加数和被加数前面适当补0,使他们包含相同的位数 51 countPoint(addent, adder); 52 //前面再补一个0,确定和的最多位数 53 addent = "0" + addent; 54 adder = "0" + adder; 55 //从低位开始,对应位相加,结果写进被加数中,如果有进位,直接给被加数前一位加1 56 for (int i = (int) addent.length() - 1; i > 0; i--) { 57 addent[i] = addent[i] + adder[i] - 48; 58 if (addent[i] > ‘9‘) { 59 addent[i] = addent[i] - 10; 60 addent[i - 1] = addent[i - 1] + 1; 61 } 62 } 63 return clearZeros(addent); 64 } 65 66 string subtraction(string subtrahend, string subtractor) 67 { 68 //先对位,在减数和被减数前面适当补0,使他们包含相同的位数 69 countPoint(subtrahend, subtractor); 70 //判断被减数和减数谁大,保证被减数大于减数 71 if (bigger(subtrahend, subtractor)) { 72 subtrahend[0] = subtrahend[0] - subtractor[0] + 48; 73 for (int i = 1; i < (int)subtrahend.length(); i++) { 74 if (subtrahend[i] >= subtractor[i]) { 75 subtrahend[i] = subtrahend[i] - subtractor[i] + 48; 76 } else { 77 subtrahend[i] = subtrahend[i] - subtractor[i] + 10 + 48; 78 subtrahend[i - 1]--; 79 } 80 } 81 } else { 82 subtrahend = ‘-‘ + subtraction(subtractor, subtrahend); 83 } 84 return subtrahend; 85 } 86 87 string multiplication(string multiplicand, string multiplier) 88 { 89 string result = "0"; 90 for (int i = (int)multiplier.length() - 1; i >= 0 ; i--) { 91 for (char c = ‘1‘; c <= multiplier[i]; c++) { 92 result = addition(result, multiplicand); 93 } 94 multiplicand = multiplicand + "0"; 95 } 96 return clearZeros(result); 97 } 98 99 // 试商法 100 string division(string dividend, string divisor) 101 { 102 // 存放商 103 string result; 104 // 存放余数 105 string remains; 106 for (int i = 0; i < (int)dividend.length(); i++) { 107 remains = remains + dividend[i]; 108 result = result + "0"; 109 // 从1往上试 110 while (bigger(remains, result)) { 111 cout << result << "-----------" << remains << endl; 112 result[result.length() - 1]++; 113 remains = subtraction(remains, divisor); 114 } 115 } 116 return clearZeros(result); 117 } 118 int main(int argc, const char * argv[]) 119 { 120 string a, b; 121 int tests; 122 cin >> tests; 123 while (tests--) { 124 cin >> a >> b; 125 //正整数高精度加法,从低位开始 126 //cout << addition(a, b) << endl; 127 //正整数高精度减法,从高位开始 128 //cout << subtraction(a, b) << endl; 129 //正整数高精度乘法,将乘法转换为加法进行运算 130 //cout << multiplication(a, b) << endl; 131 cout << division(a, b) << endl; 132 //正整数高精度除法 133 134 } 135 return 0; 136 }
标签:style blog io ar color os 使用 sp for
原文地址:http://www.cnblogs.com/ashley-/p/4151867.html