zoukankan      html  css  js  c++  java
  • 【算法】大数乘法

    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
  • 相关阅读:
    BFS(广度优先搜索)
    有源点最短路径--Dijkstra算法
    DFS(深度优先搜索)
    循环双链表基本操作
    有向图的邻接表
    无向网的邻接矩阵
    双链表的基本运算
    项目环境搭建【Docker+k8s】十 || kubernetes资源配置运行容器
    项目环境搭建【Docker+k8s】九 || kubernetes创建容器
    项目环境搭建【Docker+k8s】八 || kubernetes集群部署
  • 原文地址:https://www.cnblogs.com/cheermyang/p/6064024.html
Copyright © 2011-2022 走看看