zoukankan      html  css  js  c++  java
  • 高精度入门(减法、加法、乘法)之 CODE[VS] 3115、3116、3117

    3115 高精度练习之减法:

      1 #include <iostream>
      2 #include <cstdio>
      3 #include <cstdlib>
      4 #include <cmath>
      5 #include <string>
      6 #include <algorithm>
      7 #include <cstring>
      8 #include <set>
      9 #include <utility>
     10 #include <locale>
     11 #include <ctime>
     12 using namespace std;
     13 //using int64 = long long;
     14 const int INF = 0x3f3f3f3f;
     15 const int MaxN = 110;
     16 
     17 string A, B;
     18 string ans;
     19 
     20 void Repair()
     21 {
     22     // 使两个字符串具有相同长度
     23     if (A.size() < B.size())
     24     {
     25         for (int i = A.size(); i < B.size(); ++i)
     26         {
     27             A = '0' + A;
     28         }
     29     }else
     30     {
     31         for (int i = B.size(); i < A.size(); ++i)
     32         {
     33             B = '0' + B;
     34         }
     35     }
     36 }
     37 
     38 void Solve()
     39 {
     40 
     41     bool isNegative = true;
     42     // 倘若A<B,输出负号,并交换A和B的值
     43     for (int i = 0; i < A.size(); ++i)
     44     {
     45         if (A[i] - '0' == B[i] - '0') continue;
     46         if (A[i]-'0' > B[i]-'0')
     47         {
     48             isNegative = false;
     49         }
     50         break;
     51     }
     52     if (isNegative) {
     53         cout << "-";
     54         swap(A, B);
     55     }
     56     // 大数减法
     57     for (int i = A.size() - 1; i >= 0; --i)
     58     {
     59         if (A[i] < B[i])
     60         {
     61             // 借位,注意所借之位为0的情况,借位之后,这些位变为9
     62             int tmp = i - 1;
     63             while ((A[tmp]-'0')-1 < 0) --tmp;
     64             A[tmp] = '0' + ((A[tmp] - '0') - 1);
     65             ++tmp;
     66             while (tmp < i)
     67             {
     68                 A[tmp] = '9';
     69                 ++tmp;
     70             }
     71             ans = static_cast<char>('0' + ((A[i] - '0' + 10) - (B[i] - '0'))) + ans;
     72         }else
     73         {
     74             // 无需借位,直接减
     75             ans = static_cast<char>('0' + (A[i] - B[i])) + ans;
     76         }
     77     } 
     78     bool Judge = false;
     79     for (int i = 0; i < ans.size(); ++i)
     80     {
     81         // 忽略前导零
     82         if (ans[i] != '0' || Judge)
     83         {
     84             cout << ans[i];
     85             Judge = true;
     86         }
     87     }
     88     cout << endl;
     89 }
     90 
     91 int main()
     92 {
     93 
     94     while (cin >> A >> B)
     95     {
     96         ans.clear();
     97         Repair();
     98         Solve();
     99     }
    100 
    101 #ifdef HOME
    102     cerr << "Time elapsed: " << clock() / CLOCKS_PER_SEC << " ms" << endl;
    103 #endif
    104     return 0;
    105 }

    3116 高精度练习之加法:

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstdlib>
     4 #include <cmath>
     5 #include <string>
     6 #include <algorithm>
     7 #include <cstring>
     8 #include <set>
     9 #include <utility>
    10 #include <locale>
    11 #include <ctime>
    12 using namespace std;
    13 //using int64 = long long;
    14 const int INF = 0x3f3f3f3f;
    15 const int MaxN = 110;
    16 
    17 string A, B;
    18 string ans;
    19 
    20 void Repair()
    21 {
    22     if (A.size() < B.size())
    23     {
    24         for (int i = A.size(); i < B.size(); ++i)
    25         {
    26             A = '0' + A;
    27         }
    28     }else
    29     {
    30         for (int i = B.size(); i < A.size(); ++i)
    31         {
    32             B = '0' + B;
    33         }
    34     }
    35 }
    36 
    37 void Solve()
    38 {
    39     int tmp = 0;
    40     for (int i = A.size() - 1; i >= 0; --i)
    41     {
    42         if ((A[i]-'0') + (B[i] - '0') + tmp > 9)
    43         {
    44             ans = static_cast<char>('0' + ((A[i] - '0') + (B[i] - '0') + tmp) % 10) + ans;
    45             tmp = 1;
    46         }else
    47         {
    48             ans = static_cast<char>('0' + ((A[i] - '0') + (B[i] - '0') + tmp)) + ans;
    49             tmp = 0;
    50         }
    51     }
    52     if (tmp) ans = '1' + ans;
    53     cout << ans << endl;;
    54 }
    55 
    56 int main()
    57 {
    58 
    59     while (cin >> A >> B)
    60     {
    61         ans.clear();
    62         Repair();
    63         Solve();
    64     }
    65 
    66 #ifdef HOME
    67     cerr << "Time elapsed: " << clock() / CLOCKS_PER_SEC << " ms" << endl;
    68 #endif
    69     return 0;
    70 }

    3117 高精度练习之乘法:

      1 #include <iostream>
      2 #include <cstdio>
      3 #include <cstdlib>
      4 #include <cmath>
      5 #include <string>
      6 #include <algorithm>
      7 #include <cstring>
      8 #include <set>
      9 #include <utility>
     10 #include <locale>
     11 #include <ctime>
     12 using namespace std;
     13 //using int64 = long long;
     14 const int INF = 0x3f3f3f3f;
     15 const int MaxN = 110;
     16 
     17 string _A, _B;
     18 
     19 void Repair(string& A, string& B)
     20 {
     21     if (A.size() < B.size())
     22     {
     23         for (int i = A.size(); i < B.size(); ++i)
     24         {
     25             A = '0' + A;
     26         }
     27     }else
     28     {
     29         for (int i = B.size(); i < A.size(); ++i)
     30         {
     31             B = '0' + B;
     32         }
     33     }
     34 }
     35 
     36 string Add(string A, string B)
     37 {
     38     Repair(A, B);
     39     string ans;
     40     int tmp = 0;
     41     for (int i = A.size() - 1; i >= 0; --i)
     42     {
     43         if ((A[i] - '0') + (B[i] - '0') + tmp > 9)
     44         {
     45             ans = static_cast<char>('0' + ((A[i] - '0') + (B[i] - '0') + tmp) % 10) + ans;
     46             tmp = 1;
     47         }
     48         else
     49         {
     50             ans = static_cast<char>('0' + ((A[i] - '0') + (B[i] - '0') + tmp)) + ans;
     51             tmp = 0;
     52         }
     53     }
     54     if (tmp) ans = '1' + ans;
     55     return ans;
     56 }
     57 
     58 string Mul(string A, char B)
     59 {
     60     string ans;
     61     int tmp = 0;
     62     int result;
     63     for (int i = A.size() - 1; i >= 0; --i)
     64     {
     65         result = (A[i] - '0')*(B - '0') + tmp;
     66         tmp = result / 10;
     67         ans = static_cast<char>('0' + result % 10) + ans;
     68     }
     69     if (tmp) ans = static_cast<char>('0' + tmp) + ans;
     70     return ans;
     71 }
     72 
     73 void Solve(string A, string B)
     74 {
     75     string ans = "0";
     76     string tmp;
     77     int num = 0; // 统计加的0的个数
     78     for (int i = B.size() - 1; i >= 0; --i)
     79     {
     80         tmp = Mul(A, B[i]);
     81         for (int j = 0; j < num; ++j) tmp += '0';
     82         ans = Add(ans, tmp);
     83         ++num;
     84     }
     85     cout << ans << endl;;
     86 }
     87 
     88 int main()
     89 {
     90 
     91     while (cin >> _A >> _B)
     92     {
     93         Solve(_A, _B);
     94     }
     95 
     96 #ifdef HOME
     97     cerr << "Time elapsed: " << clock() / CLOCKS_PER_SEC << " ms" << endl;
     98 #endif
     99     return 0;
    100 }
  • 相关阅读:
    使用vs2010编译 Python SIP PyQt4
    谷歌编程指南
    【转】微策略面经相关资料
    KMP 算法
    C++ 拷贝构造函数
    虚继承 虚表 定义一个不能被继承的类
    cache的工作原理
    背包问题
    【转】C/C++ 内存对齐
    【转】 Linux/Unix 进程间通信的各种方式及其比较
  • 原文地址:https://www.cnblogs.com/shijianming/p/4847733.html
Copyright © 2011-2022 走看看