【算法】大数乘法
POJ:1001
http://poj.org/problem?id=1001
===============我是分割线=================
1 /* 2 *Copyright: CheerM 3 *Author: CheerM 4 *Date: 2016-11-14 5 *Description: 实现 底数B为6位宽浮点数 指数E为(0,25】的数,求值 6 */ 7 8 #include <iostream> 9 #include <string> 10 #include <vector> 11 #include <iomanip> 12 13 using namespace std; 14 15 const int max_ = 10000;//保留四位数 16 17 /* 18 *Function: multiply 19 *Description: 被乘数任意长vector<int>& multiplicand, 乘数为定长,不超过6位的int multiplier,相乘的值保存在vector<int>& multiplicand中 20 *parameter: vector<int>& multiplicand 表示任意长的被乘数 21 * int multiplier 表示定长不超过6位数的乘数 22 *Return: void 23 */ 24 void multiply(vector<int>& multiplicand, int multiplier) { 25 int carry = 0; 26 for (int i = 0; i < multiplicand.size(); i++) { 27 int t1 = multiplicand[i] * multiplier + carry; 28 multiplicand[i] = t1 % max_; 29 carry = t1 / max_; 30 } 31 if (carry != 0) { 32 while (carry) { 33 multiplicand.push_back(carry % max_); 34 carry /= max_; 35 } 36 } 37 } 38 39 int main() { 40 string base;//底数 41 int exponentiation, point, mark;//指数,小数点后有效位数,‘.’标识符 42 while (cin >> base >> exponentiation) { 43 point = mark = 0; 44 45 //记录小数点后数字位数,忽略最右的连续0 46 for (int i = base.size() - 1; i >= 0; i--) { 47 if (base[i] == '0' && point == 0) 48 continue; 49 else if (base[i] == '.') { 50 mark = 1; 51 break; 52 } 53 else 54 point++; 55 } 56 if (!mark)point = 0; 57 58 //把底数base从字符串转化为整型,e.g. 12.345 -> int:12345 point=3, 1.0100 -> int:101 point=2 59 int tempBase = 0, tmp = point;//tempBase是底数的int形式 60 mark = 0; 61 for (int i = 0; i < base.size() && tmp >= 0; i++) { 62 if (base[i] >= '0' && base[i] <= '9') { 63 tempBase = tempBase * 10 + base[i] - '0'; 64 } 65 else if (base[i] == '.') { 66 mark = 1; 67 } 68 69 if (mark == 1) { 70 tmp--; 71 } 72 } 73 74 //初始化被乘数为1,循环相乘 75 vector<int> result;//vector来存储超长int型整数,因为乘数有可能是6位数,而int最大值可以10位,所以result的每一个单位用来存储4位结果,从低到高 76 result.push_back(1); 77 point *= exponentiation; 78 while (exponentiation--) { 79 multiply(result, tempBase); 80 } 81 82 //把vector转为string 83 string ss; 84 for (int i = 0; i < result.size(); i++) { 85 int tt = result[i]; 86 for (int j = 0; j < 4; j++) { 87 ss.push_back(tt % 10 + '0'); 88 tt /= 10; 89 if (ss.size() == point) ss.push_back('.'); 90 if (i == result.size() - 1 && tt == 0) break; 91 } 92 } 93 while (ss.size() < point) {//补0 94 ss.push_back('0'); 95 if (ss.size() == point) ss.push_back('.'); 96 } 97 98 //输出 99 for (int i = ss.size() - 1; i >= 0; i--) 100 cout << ss[i]; 101 cout << endl; 102 } 103 104 system("pause"); 105 return 0; 106 }