zoukankan      html  css  js  c++  java
  • 全是套路——高精度加法

      1 #include<iostream>
      2 #include<cstring>
      3 #include<string>
      4 #include <vector>
      5 #include <algorithm>
      6 
      7 using namespace std;
      8 
      9 int compare(string a, string b)
     10 {
     11     if (a.size() > b.size())
     12     {
     13         return 1;
     14     }
     15     if (a.size() < b.size())
     16     {
     17         return -1;
     18     }
     19     for (int i = 0; i < a.size(); i++)
     20     {
     21         if (a[i]>b[i])
     22         {
     23             return 1;
     24         }
     25         if (a[i]<b[i])
     26         {
     27             return -1;
     28         }
     29     }
     30     return 0;
     31 }
     32 
     33 string add(string a, string b)
     34 {
     35     string res = "";
     36     int flag = 0;
     37     int i, j;
     38     for (i = a.size() - 1, j = b.size() - 1; i >= 0 && j >= 0; i--, j--)
     39     {
     40         int tmp = a[i] + b[j] - 2 * '0' + flag;
     41         if (tmp >= 10)
     42         {
     43             tmp -= 10;
     44             flag = 1;
     45         }
     46         else
     47         {
     48             flag = 0;
     49         }
     50         res.insert(res.begin(), tmp + '0');
     51     }
     52     i++; j++;
     53     
     54     if (i == 0 && j == 0)
     55     {
     56         if (flag == 1)
     57         {
     58             res.insert(0, "1");
     59         }
     60     }
     61     else
     62     {
     63         string lastStr;
     64         if (i != 0)
     65         {
     66             lastStr = a.substr(0, i);
     67         }
     68         if (j != 0)
     69         {
     70             lastStr = b.substr(0, j);
     71         }
     72         if (flag == 0)
     73         {
     74             res.insert(0, lastStr);
     75         }
     76         else
     77         {
     78             for (int k = lastStr.size() - 1; k >= 0; k--)
     79             {
     80                 int tmp = lastStr[k] - '0' + flag;
     81                 if (tmp >= 10)
     82                 {
     83                     tmp -= 10;
     84                     flag = 1;
     85                 }
     86                 else
     87                 {
     88                     flag = 0;
     89                 }
     90                 res.insert(res.begin(), tmp + '0');
     91             }
     92             if (flag == 1)
     93             {
     94                 res.insert(0, "1");
     95             }
     96         }
     97     }
     98     return res;
     99 }
    100 //保证大-小
    101 string minus1(string a, string b)
    102 {
    103     string res;
    104     int flag = 0;
    105 
    106     int i, j;
    107     for (i = a.size() - 1, j = b.size() - 1; i >= 0 && j >= 0; i--, j--)
    108     {
    109         int tmp = a[i] - b[j] - flag;
    110         if (tmp < 0)
    111         {
    112             tmp += 10;
    113             flag = 1;
    114         }
    115         else
    116         {
    117             flag = 0;
    118         }
    119         res.insert(res.begin(), tmp + '0');
    120     }
    121 
    122 
    123     for (int k = i; k >= 0; k--)
    124     {
    125         int tmp = a[k] - flag - '0';
    126         if (tmp < 0)
    127         {
    128             tmp += 10;
    129             flag = 1;
    130         }
    131         else
    132         {
    133             flag = 0;
    134         }
    135         if (k == 0)
    136         {
    137             if (tmp != 0)
    138             {
    139                 res.insert(res.begin(), tmp + '0');
    140             }
    141         }
    142         else
    143         {
    144             res.insert(res.begin(), tmp + '0');
    145         }
    146     }
    147     return res;
    148 }
    149 
    150 string fun(string a)
    151 {
    152     int n = 0;
    153     for (int i = 0; i < a.size(); i++)
    154     {
    155         if (a[i] != '0')
    156         {
    157             break;
    158         }
    159         else
    160         {
    161             n++;
    162         }
    163     }
    164     if (n == a.size())
    165     {
    166         return "0";
    167     }
    168     a = a.substr(n, a.size() - n);
    169     return a;
    170 }
    171 
    172 int main()
    173 {
    174     string str1, str2;
    175     while (cin >> str1>>str2)
    176     {
    177         bool sy1 = true, sy2 = true;
    178         if (str1[0] == '-')
    179         {
    180             sy1 = false;
    181             str1 = str1.substr(1, str1.size() - 1);
    182         }
    183         if (str2[0] == '-')
    184         {
    185             sy2 = false;
    186             str2 = str2.substr(1, str2.size() - 1);
    187         }
    188         
    189         if ((sy1 == true && sy2 == true) || (sy1 == false && sy2 == false))
    190         {
    191             string tmp = fun(add(str1, str2));
    192             if (sy1)
    193             {
    194                 cout << tmp << endl;
    195             }
    196             else
    197             {
    198                 if (tmp == "0")
    199                 {
    200                     cout << tmp << endl;
    201                 }
    202                 else
    203                 {
    204                     cout << "-" << tmp << endl;
    205                 }
    206             }
    207         }
    208         else
    209         {
    210             string tmp;
    211             if (compare(str1, str2) == 1)
    212             {
    213                 tmp = fun(minus1(str1, str2));
    214                 if (sy1)
    215                 {
    216                     cout << tmp << endl;
    217                 }
    218                 else
    219                 {
    220                     if (tmp == "0")
    221                     {
    222                         cout << tmp << endl;
    223                     }
    224                     else
    225                     {
    226                         cout << "-" << tmp << endl;
    227                     }
    228                 }
    229             }
    230             else
    231             {
    232                 tmp = fun(minus1(str2, str1));
    233                 if (sy1)
    234                 {
    235                     if (tmp == "0")
    236                     {
    237                         cout << tmp << endl;
    238                     }
    239                     else
    240                     {
    241                         cout << "-" << tmp << endl;
    242                     }
    243                 }
    244                 else
    245                 {
    246                     cout << tmp << endl;
    247                 }
    248             }
    249         }
    250 
    251         
    252     }
    253     
    254 
    255     return 0;
    256 }
    自己写的代码,很乱

    /**************************************************************************************************************************************************************************************/

    2017年2月14日修改。

    发这个帖子时只是想记录下自己写的代码,一定会去修改的。正好昨天在网上看到一个别人写的例子。我看了下,代码简洁,于是自己也仿写了下。

     1 string Add(string a, string b)
     2 {
     3     string res;
     4 
     5     int g = 0;
     6     for (int i = a.size() - 1, j = b.size() - 1; (g == 1) || (i >= 0 || j >= 0); i--, j--)
     7     {
     8         int x = g;
     9         if (i >= 0)
    10         {
    11             x += (a[i] - '0');
    12         }
    13         if (j >= 0)
    14         {
    15             x += (b[j] - '0');
    16         }
    17         res.insert(res.begin(), x % 10 + '0');
    18 
    19         //判断进位与否
    20         g = x / 10;
    21     }
    22 
    23     cout << res << endl;
    24     return res;
    25 }
    26 
    27 /*
    28 减法函数
    29 在函数外部保证参数a默认大于b
    30 返回结果为正数字符串
    31 */
    32 string Minus(string a, string b)
    33 {
    34     string res;
    35 
    36     for (int i = a.size() - 1, j = b.size() - 1; i >= 0 || j >= 0; i--, j--)
    37     {
    38         int x = 0;
    39         if (i >=0)
    40         {
    41             x += (a[i] - '0');
    42         }
    43         if (j >=0)
    44         {
    45             x -= (b[j] - '0');
    46         }
    47 
    48         //两种情况:1正常借位。2最高位借位
    49         if (x < 0)
    50         {
    51             //最高位借位
    52             if (i - 1 <= -1)
    53             {
    54                 res.insert(res.begin(), 0 - x + '0');
    55             }
    56             else//普通借位
    57             {
    58                 res.insert(res.begin(), x + 10 + '0');
    59                 a[i - 1]--;
    60             }
    61         }
    62         else
    63         {
    64             res.insert(res.begin(), x + '0');
    65         }
    66     }
    67 
    68     //弹出头部的0
    69     while (res[0] == '0'&&res.size() > 1)
    70     {
    71         res.erase(res.begin(), res.begin() + 1);
    72     }
    73 
    74     cout << res << endl;
    75     return res;
    76 }
    简洁一些

    之前自己写的时候,对于进位标志和最高位进位的处理,我写的很麻烦。现在的加法函数就很明了了。

    用g表示进位,并且把g==1放进循环的判断。意思是:如果i和j判断都为假时,理论上到最高位了。不过进位不为0,还要计算啊。所以再把进位g算上。

    这比我以前,在循环外再加上判断的写法好多了。

    对于减法也是同样的道理。

    不过减法肯定不会出现进位,只有借位。

    其实现方式为:一个x变量=0,每次都加上被减数,然后减去减数。

    判断x的大小,如果不是最高位,则把被减数的前一位减去1.如果是最高位就取相反数。

    两者最妙之处在于。有一个if(i>0)和if(j>0)。这样就可以完美的兼容循环中的条件判断(i>=0)和(j>=0)

    因为i和j任何一个等于0时,加法和减法都不会减数。所以在循环内部需要区分,到底哪个数已经提前到头了(到最高位了?)。

    这样,就可以用一个循环写出加法和减法。

  • 相关阅读:
    PHP基础之文件的上传与下载
    PHP封装 文件上传
    PHP基础之文件操作
    Session案例:实现用户登录
    PHP基础之会话技术
    PHP基础之超全局变量
    PHP基础之HTTP协议
    PHP基础之错误处理及调试
    PHP基础之包含文件
    剑指offer-复杂链表的复制
  • 原文地址:https://www.cnblogs.com/wyc199288/p/6379905.html
Copyright © 2011-2022 走看看