• 高精度浮点型数据加,减,乘运算


    大正数加法代码:(适用高精度浮点型,减法,乘法同样适用)

     1 #include <iostream>
     2 #include <stdio.h>
     3 #include <string.h>
     4 #include <string>
     5 using namespace std;
     6 #define CLE(name) memset(name, 0, sizeof (name))
     7 const int max_n = 1010;
     8 
     9 int num1[max_n], num2[max_n];
    10 
    11 int main ()
    12 {
    13     string str1, str2;
    14     int len1, len2;
    15     int tag1, tag2;
    16     int sign1, sign2, sign;
    17     int i, k, bg, ed, up;
    18     int cas = 1;
    19     while (cin >> str1 >> str2)
    20     {
    21         CLE(num1), CLE(num2);
    22         len1 = str1.length();
    23         len2 = str2.length();
    24         tag1 = str1.find("."); //数字一小数点的位置,没有则返回-1,有则返回所在位置 
    25         tag2 = str2.find(".");
    26         sign1 = tag1 == -1 ? 0 : len1 - tag1 - 1;
    27         sign2 = tag2 == -1 ? 0 : len2 - tag2 - 1;
    28         sign = sign1 > sign2 ? sign1 : sign2;
    29         for (i = len1-1, k = sign - sign1; i >= 0; i --)
    30         {
    31             if (str1[i] != '.')
    32                 num1[k++] = str1[i] - '0';
    33         }
    34         for (i = len2-1, k = sign - sign2; i >= 0; i --)
    35         {
    36             if (str2[i] != '.')
    37             {
    38                 num2[k ++] = str2[i] - '0';
    39             }
    40         }
    41         for (i = 0, up = 0; i < max_n; i ++)
    42         {
    43             num1[i] = num1[i] + num2[i] + up;
    44             up = num1[i]/10;
    45             num1[i] %= 10;
    46         }
    47         bg = 0;
    48         ed = sign;
    49         printf ("Case %d:
    ", cas++ );
    50         cout << str1 << " + " << str2 << " = ";
    51         for (i = max_n - 1; i >= 0; i --)
    52         {
    53             if (i == sign - 1)
    54             {
    55                 bg = i;
    56                 printf ("0");
    57                 break;
    58             }
    59             if (num1[i])
    60             {
    61                 bg = i;
    62                 break;
    63             }
    64         }
    65         for (i = 0; i < sign; i ++)
    66         {
    67             if (num1[i])
    68             {
    69                 ed = i;
    70                 break;
    71             }
    72         }
    73         for (i = bg; i >= ed; i --)
    74         {
    75             if (i == sign - 1)
    76                 printf (".");
    77             printf ("%d", num1[i]);
    78         }
    79         printf ("
    
    ");
    80 
    81     }return 0;
    82 }
    View Code

    大正数减法代码:

      1 #include <iostream>
      2 #include <stdio.h>
      3 #include <math.h>
      4 #include <string>
      5 #include <string.h>
      6 using namespace std;
      7 #define CLE(name) memset(name, 0, sizeof (name))
      8 const int max_n = 1010;
      9 
     10 int num1[max_n], num2[max_n];
     11 string str1, str2;
     12 
     13 int deal (int len1, int len2, int tag1, int tag2)
     14 {
     15     int min_l = len1 >= len2 ? len1 : len2;
     16 //    cout << tag1 << " " << tag2 << endl;
     17     if (tag1 > tag2 && tag2 != -1)
     18         return 1;
     19     else if (tag1 < tag2 && tag1 != -1)
     20         return 2;
     21     else if (tag1 == -1 && tag2 == -1)
     22     {
     23         if (len1 != len2)
     24             return len1 > len2 ? 1 : 2;
     25         for (int i = len1 - 1; i >= 0; i --)
     26         {
     27             if (str1[i] > str2[i])
     28                 return 1;
     29             else if (str1[i] < str2[i])
     30                 return 2;
     31         }
     32     }
     33     else if (tag1 == tag2)
     34     {
     35         for (int i = tag1 - 1; i >= 0; i --)
     36         {
     37             if (str1[i] > str2[i])
     38                 return 1;
     39             else if (str1[i] < str2[i])
     40                 return 2;
     41         }
     42         for (int i = tag1 + 1; i < min_l; i ++)
     43         {
     44             if (str1[i] > str2[i])
     45                 return 1;
     46             else if (str1[i] < str2[i])
     47                 return 2;
     48         }
     49         if (min_l == len1)
     50             return 2;
     51         if (min_l == len2)
     52             return 1;
     53     }
     54     else if (tag1 == -1)
     55     {
     56         int tmp_l = len2 - tag2;
     57         if (tmp_l != len1)
     58             return len1 > tmp_l? 1 : 2;
     59         else
     60         {
     61             for (int i = len1 - 1; i >= 0; i --)
     62             {    
     63                 if (str1[i] > str2[i])
     64                     return 1;
     65                 else if (str1[i] < str2[i])
     66                     return 2;
     67             }
     68         }
     69         return 2;
     70     }
     71     else if (tag2 == -1)
     72     {
     73         int tmp_l = len1 - tag1;
     74         if (tmp_l != len2)
     75             return tmp_l > len2? 1 : 2;
     76         else
     77         {
     78             for (int i = len2 - 1; i >= 0; i --)
     79             {    
     80                 if (str1[i] > str2[i])
     81                     return 1;
     82                 else if (str1[i] < str2[i])
     83                     return 2;
     84             }
     85         }
     86         return 1;
     87     }
     88     return 1;
     89 }
     90 
     91 int main ()
     92 {
     93     int judge;
     94 
     95     int len1, len2, tag1, tag2;
     96     int sign1, sign2, sign;
     97     int bg, ed, i, k, bro;
     98     while (cin >> str1 >> str2)
     99     {
    100         CLE(num1), CLE(num2);
    101         len1 = str1.length();
    102         len2 = str2.length();
    103         tag1 = str1.find(".");
    104         tag2 = str2.find(".");
    105         sign1 = tag1 == -1 ? 0 : len1 - tag1 - 1;
    106         sign2 = tag2 == -1 ? 0 : len2 - tag2 - 1;
    107         sign = sign1 > sign2 ? sign1 : sign2;
    108         judge = deal (len1, len2, tag1, tag2);
    109         if (judge == 1)
    110         {
    111             k = sign - sign1;
    112             for (i = len1-1; i >= 0; i --)
    113             {
    114                 if (str1[i] != '.')
    115                     num1[k ++] = str1[i] - '0';
    116             }
    117             k = sign -sign2;
    118             for (i = len2-1; i >= 0; i --)
    119             {
    120                 if (str2[i] != '.')
    121                     num2[k ++] = str2[i] - '0';
    122             }
    123         }
    124         else
    125         {
    126             k = sign - sign2;
    127             for (i = len2-1; i >= 0; i --)
    128             {
    129                 if (str2[i] != '.')
    130                     num1[k ++] = str2[i] - '0';
    131             }
    132             k = sign - sign1;
    133             for (i = len1-1; i >= 0; i --)
    134             {
    135                 if (str1[i] != '.')
    136                     num2[k ++] = str1[i] - '0';
    137             }
    138         }
    139         for (i = 0, bro = 0; i < max_n; i ++)
    140         {
    141             if (num1[i] - num2[i] < 0)
    142             {
    143                 bro = 1;
    144                 num1[i + 1] --;
    145                 num1[i] = 10*bro + num1[i] - num2[i];
    146             }
    147             else
    148             {
    149                 num1[i] = num1[i] - num2[i];
    150             }
    151         }
    152 //        cout << judge << " " << sign << endl;
    153         cout << str1 << " - " << str2 << " = ";
    154         if (judge == 2)
    155             printf ("-");
    156         bg = 0;
    157         ed = sign;
    158         for (i = max_n - 1; i >= 0; i --)
    159         {
    160             if (i == sign - 1)
    161             {
    162                 bg = i;
    163                 printf ("0");
    164                 break;
    165             }
    166             if (num1[i])
    167             {
    168                 bg = i;
    169                 break;
    170             }
    171         }
    172         for (i = 0; i < sign; i ++)
    173         {
    174             if (num1[i])
    175             {
    176                 ed = i;
    177                 break;
    178             }
    179         }
    180         for (i = bg; i >= ed; i --)
    181         {
    182             if (i == sign - 1)
    183                 printf (".");
    184             printf ("%d", num1[i]);
    185         }
    186         printf ("
    
    ");
    187     }
    188 }
    View Code

    大数乘法代码:

      1 #include <iostream>
      2 #include <stdio.h>
      3 #include <string.h>
      4 #include <string>
      5 using namespace std;
      6 
      7 #define CLE(name) memset(name, 0, sizeof (name))
      8 const int max_n = 1010;
      9 int num1[max_n], num2[max_n];
     10 int result[2*max_n];
     11 string str1, str2;
     12 
     13 int main ()
     14 {
     15     int i, k, bg, ed, judge, up;
     16     int sign, sign1, sign2;
     17     int tag1, tag2;
     18     int len1, len2;
     19     while (cin >> str1 >> str2)
     20     {
     21         CLE(num1), CLE(num2), CLE(result);
     22         len1 = str1.length();
     23         len2 = str2.length();
     24         tag1 = str1.find(".");
     25         tag2 = str2.find(".");
     26         sign1 = tag1 == -1 ? 0 : len1 - tag1 - 1;
     27         sign2 = tag2 == -1 ? 0 : len2 - tag2 - 1;
     28         sign = sign1 + sign2;
     29         judge = 0;
     30         for (i = len1 - 1, k = 0; i >= 0; i --)
     31         {
     32             if (str1[i] == '-')
     33             {
     34                 judge ++;
     35                 break;
     36             }
     37             if (str1[i] != '.')
     38                 num1[k ++] = str1[i] - '0';
     39         }
     40         for (i = len2 - 1, k = 0; i >= 0; i --)
     41         {
     42             if (str2[i] == '-')
     43             {
     44                 judge ++;
     45                 break;
     46             }
     47             if (str2[i] != '.')
     48                 num2[k ++] = str2[i] - '0';
     49         }
     50         for (i = 0; i < max_n; i ++)
     51         {
     52             for (k = 0; k < max_n; k ++)
     53             {
     54                 result[i+k] += num1[i] * num2[k];
     55 
     56             }
     57         }
     58         for (i = 0, up = 0; i < 2*max_n; i ++)
     59         {
     60             int tmp = result[i];
     61             result[i] = (result[i] + up) % 10;
     62             up = (tmp + up) / 10;
     63         }
     64         cout << str1 << " * " <<str2 << " = ";
     65         if(judge%2)
     66             printf("-");
     67         bg = 0;
     68         ed = sign;
     69         for (i = 2*max_n - 1; i >= 0; i --)
     70         {
     71             if (i == sign - 1 && sign)
     72             {
     73                 bg = i;
     74                 break;
     75             }
     76             if (result[i])
     77             {
     78                 bg = i;
     79                 break;
     80             }
     81         }
     82         for (i = 0; i < sign; i ++)
     83         {
     84             if (num1[i])
     85             {
     86                 ed = i;
     87                 break;
     88             }
     89         }
     90         for (i = bg; i >= ed; i --)
     91         {
     92             if (i == sign - 1 && sign)
     93             {
     94                 printf ("%s", i==bg ? "0." : ".");
     95             }
     96             printf ("%d", result[i]);
     97         }
     98         printf ("
    ");
     99     }
    100     return 0;
    101 }
    View Code

    高精度浮点除法,能力有限没能写出来,若有大神路过,求指点一二!

    以上代码,在dev_c中编译通过并经本人测试暂未发现bug,若使用者发现bug,请告知,感激不尽!

  • 相关阅读:
    python_论优点&缺点
    Python_正则表达式指南
    python学习
    Linux命令之basename 命令
    mysqlpython模块的内存泄露和中文字符编码问题
    python:ip地址转换
    程序员技术练级攻略转
    常用python代码
    shell export 作用转载
    python_文本文件里面随机抽取若干行,写入新的文本文件里面
  • 原文地址:https://www.cnblogs.com/shengshouzhaixing/p/3160070.html
Copyright © 2020-2023  润新知