zoukankan      html  css  js  c++  java
  • 100位有符号整形数加法(数组)

      1 //加法器,若要变为减法器,只需改动相应的判断条件即可
      2 #include <iostream>
      3 using namespace std;
      4 struct num//储存多位的整形数字
      5 {
      6     char input[102];
      7     char sign;
      8     char data[101];
      9     int len;
     10 };
     11 struct num plus_(struct num a, struct num b);//无符号整形的加法
     12 struct num minus_(struct num a, struct num b);//无符号整形的减法,要求a>b
     13 int main()
     14 {
     15     while (1)//while循环用作多次测试
     16     {
     17         struct num a, b, c;//a,b为加数,c储存二者相加结果
     18         cin >> a.input;
     19         cin >> b.input;
     20         if (a.input[0] == '-')//把a和b的符号存起来,把去掉符号的数放到结构体的另一个数组里面
     21         {
     22             a.sign = '-';
     23             for (int i = 1; i <= strlen(a.input); i++)
     24             {
     25                 a.data[i - 1] = a.input[i];
     26             }
     27         }
     28         else
     29         {
     30             a.sign = '+';
     31             for (int i = 0; i <= strlen(a.input); i++)
     32             {
     33                 a.data[i] = a.input[i];
     34             }
     35         }
     36         if (b.input[0] == '-')
     37         {
     38             b.sign = '-';
     39             for (int i = 1; i <= strlen(b.input); i++)
     40             {
     41                 b.data[i - 1] = b.input[i];
     42             }
     43         }
     44         else
     45         {
     46             b.sign = '+';
     47             for (int i = 0; i <= strlen(b.input); i++)
     48             {
     49                 b.data[i] = b.input[i];
     50             }
     51         }
     52         //根据a,b符号的各种情况,调用plus_e和minus_函数进行运算
     53         if (a.sign == '+' && b.sign == '+')
     54         {//a,b为正数,直接相加
     55             c = plus_(a, b);
     56             const int len_ = strlen(c.data);
     57             int i = 0;
     58             for (i = 0; i < len_; i++)
     59             {
     60                 if ((len_ - i) % 4 == 0 && i!=0)
     61                     cout << ',';
     62                 cout << c.data[i];
     63             }
     64             cout << endl << "位数:" << strlen(a.data) << "" << strlen(b.data) << "" << i;
     65         }
     66         else if (a.sign == '-' && b.sign == '-')
     67         {//a,b皆为负数,则a,b去掉负号后相加,在结果前添一个负号
     68             c = plus_(a, b);
     69             if (c.data[0] != 0)
     70                 cout << '-';
     71             int i = 0;
     72             const int len_ = strlen(c.data);
     73             for (i = 0; i < len_; i++)
     74             {
     75                 if ((len_ - i) % 4 == 0 && i != 0)
     76                     cout << ',';
     77                 cout << c.data[i];
     78             }
     79             cout << endl << "位数:" << strlen(a.data) << "" << strlen(b.data) << "" << i;
     80         }
     81         else
     82         {//a,b一正一负,将a,b去掉负号后,用它们之间大的减去小的
     83             int e_flag = 0;//a比b长(也即a>b)则为1,a比b短(即a<b)则为-1
     84             int z_flag = 0;//结果为0标志
     85             int la = strlen(a.data);
     86             int lb = strlen(b.data);
     87             if (la > lb)e_flag = 1;
     88             else if (la < lb)e_flag = -1;
     89             else//若a,b等长
     90             {//下面判断它们的大小
     91                 for (int i = 0, j = 0; i < la, j < lb; i++, j++)
     92                 {
     93                     if (a.data[i] > b.data[j])
     94                     {
     95                         e_flag = 1;//a>b
     96                         break;
     97                     }
     98                     else if (a.data[i] < b.data[j])
     99                     {
    100                         e_flag = -1;//a<b
    101                         break;
    102                     }
    103                 }
    104             }
    105             if (e_flag == 1)//a>b,则c=a-b
    106             {
    107                 c = minus_(a, b);
    108                 if (a.sign == '-' && b.sign == '+')//如果a负b正且a大于b,输出'-'
    109                     cout << '-';
    110             }
    111             else if (e_flag == -1)//a<b,则c=b-a,结果前面添负号
    112             {
    113                 c = minus_(b, a);
    114                 if (a.sign == '+' && b.sign == '-')//如果a正b负且b大于a,输出'-'
    115                     cout << '-';
    116             }
    117             else//a,b相等的情况
    118             {
    119                 c.data[0] = '0';
    120                 c.data[1] = '';
    121             }
    122             int k = -1;//k为数组下标
    123             while (c.data[++k] == '0')//k移动到第一个不为'0'的地方
    124             {
    125                 if (k == strlen(c.data) - 1)//如果k移到了数组尾部,说明全为0
    126                 {
    127                     z_flag = 1;// ”为零“标志置1
    128                     break;
    129                 }
    130             }
    131             int cnt = 0;//输出计数器,代表结果的位数,也用于控制','的输出
    132             const int len_ = strlen(c.data);
    133             for (int i = k; i < len_; i++)
    134             {
    135                 if ((len_ - i) % 4 == 0 && i!=k)
    136                     cout << ',';
    137                 cout << c.data[i];
    138                 cnt++;
    139             }
    140             cout << endl << "位数:" << strlen(a.data) << "" << strlen(b.data) << "";
    141             cout << cnt;
    142         }
    143         cout << endl << endl;
    144     }
    145     return 0;
    146 }
    147 struct  num plus_(struct num a, struct num  b)
    148 {
    149     int la = strlen(a.data);
    150     int lb = strlen(b.data);
    151     struct num c = {};
    152     char s[103];//存放计算结果的栈
    153     int r = -1;//栈顶指针
    154     int cx = 0;//进位标志,须初始化为0
    155     int i, j;
    156     for (i = la - 1, j = lb - 1; i >= 0 && j >= 0; i--, j--)
    157     {
    158         int t1 = a.data[i] - '0';// -'0'操作将char转换为int
    159         int t2 = b.data[j] - '0';
    160         int t3 = t1 + t2;
    161         if (t3 + cx >= 10)//如果a,b同一位相加大于等于10,则相加结果-10并将cx置1
    162         {
    163             t3 = t3 + cx - 10;
    164             cx = 1;
    165         }
    166         else//否则将cx置0
    167         {
    168             cx = 0;
    169         }
    170         s[++r] = t3 + '0';//将此位相加结果压入s
    171     }
    172     if (i < 0)//如果b比a长,则将b剩余数据放入s
    173     {
    174         for (int k = j; k >= 0; k--)
    175         {
    176             int t = b.data[k] - '0';
    177             if (t + cx >= 10)//注意遗留的cx
    178             {
    179                 t = t + cx - 10;
    180                 cx = 1;
    181             }
    182             else
    183             {
    184                 t = t + cx;
    185                 cx = 0;
    186             }
    187             s[++r] = t + '0';
    188         }
    189     }
    190     else if (j < 0)//同上
    191     {
    192         for (int k = i; k >= 0; k--)
    193         {
    194             int t = a.data[k] - '0';
    195             if (t + cx >= 10)
    196             {
    197                 t = t + cx - 10;
    198                 cx = 1;
    199             }
    200             else
    201             {
    202                 t = t + cx;
    203                 cx = 0;
    204             }
    205             s[++r] = t + '0';
    206         }
    207     }
    208     if (cx == 1)//第一位数(最高位)是不是有进位,如果是则压入s
    209     {
    210         s[++r] = cx + '0';
    211     }
    212     int i1, i2;//将栈s的数据放到结果c的data数组中
    213     for (i1 = 0, i2 = r; i2 >= 0; i1++, i2--)
    214     {
    215         c.data[i1] = s[i2];
    216     }
    217     c.data[i1] = '';
    218     return c;
    219 }
    220 struct num minus_(struct num a, struct num b)//与plus_函数相似,+变为-,cx由进位变借位
    221 {
    222     int la = strlen(a.data);
    223     int lb = strlen(b.data);
    224     struct num c = {};
    225     char s[103];
    226     int r = -1;
    227     int cx = 0;
    228     int i, j;
    229     for (i = la - 1, j = lb - 1; i >= 0 && j >= 0; i--, j--)
    230     {
    231         int t1 = a.data[i] - '0';
    232         int t2 = b.data[j] - '0';
    233         int t3 = t1 - t2;
    234         if (t3 - cx < 0)
    235         {
    236             t3 = t3 - cx + 10;
    237             cx = 1;
    238         }
    239         else
    240         {
    241             t3 = t3 - cx;
    242             cx = 0;
    243         }
    244         s[++r] = t3 + '0';
    245     }
    246     if (i < 0)
    247     {
    248         for (int k = j; k >= 0; k--)
    249         {
    250             int t = b.data[k] - '0';
    251             if (t - cx < 0)
    252             {
    253                 t = t - cx + 10;
    254                 cx = 1;
    255             }
    256             else
    257             {
    258                 t = t - cx;
    259                 cx = 0;
    260             }
    261             s[++r] = t + '0';
    262         }
    263     }
    264     else if (j < 0)
    265     {
    266         for (int k = i; k >= 0; k--)
    267         {
    268             int t = a.data[k] - '0';
    269             if (t - cx < 0)
    270             {
    271                 t = t - cx + 10;
    272                 cx = 1;
    273             }
    274             else
    275             {
    276                 t = t - cx;
    277                 cx = 0;
    278             }
    279             s[++r] = t + '0';
    280         }
    281     }
    282     int i1, i2;
    283     for (i1 = 0, i2 = r; i2 >= 0; i1++, i2--)
    284     {
    285         c.data[i1] = s[i2];
    286     }
    287     c.data[i1] = '';
    288     return c;
    289 }
  • 相关阅读:
    Android实现不同Active页面间的跳转
    Android Dialog的整个生命周期
    fragment的基本用法
    使用URLEncoder、URLDecoder进行URL参数的转码与解码
    Android 通过URL获取网络资源
    Dialog向Activity传递数据
    Android 自定义AlertDialog(退出提示框)
    javascript的继承实现
    UVA Graph Coloring
    poj3744高速功率矩阵+可能性DP
  • 原文地址:https://www.cnblogs.com/2020R/p/12953719.html
Copyright © 2011-2022 走看看