【算法】大数乘法

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 }
View Code

 

posted @ 2016-11-15 00:04  CheerM  阅读(481)  评论(0编辑  收藏  举报