zoukankan      html  css  js  c++  java
  • 任意进制数的加法

    实现一个2-35位任意进制的加法。输入有整型表示进制是多少;两个需要相加的字符串。对于不合法的输入输出-1.

    比如:

    20

    jj

    10

    10j

    30

    gggt

    1

    ggh0

    程序实现如下:

      1 #include <string>
      2 #include <iostream>
      3 
      4 #define MAX_NUM 100000 //最多这么多位字符。发现再多的话程序崩溃
      5 using namespace std;
      6 
      7 void reversal(string &s,unsigned long long len)
      8 {
      9     for (unsigned long long i = 0; i < len / 2; i++)
     10     {
     11         char tmp = s[i];
     12         s[i] = s[len - i - 1];
     13         s[len - i - 1] = tmp;
     14     }
     15 }
     16 
     17 bool mytoInt(string s, int a[], unsigned long long len,unsigned short N)
     18 {
     19     for (unsigned long long i = 0; i < len; i++)
     20     {
     21         if (s[i] >= '0' && s[i] <= '9')
     22         {
     23             a[i] = s[i] - 48;
     24         }
     25         else if (s[i] >= 'a' && s[i] <= 'z')
     26         {
     27             a[i] = s[i] - 'a' + 10;
     28         }
     29         if (a[i] >= N)//判断输入是否合法;比如进制是10,但输入了a这样的字符。
     30         {
     31             return true;
     32         }
     33     }
     34     return false;
     35 }
     36 char myInttoChar(int a)
     37 {
     38     if (a <= 9)
     39     {
     40         return a + 48;
     41     }
     42     else
     43     {
     44         return a + 'a' - 10;
     45     }
     46     
     47 }
     48 int main()
     49 {
     50     unsigned short N;
     51     string stra, strb;
     52     
     53     while (cin >> N )
     54     {
     55         int sa[MAX_NUM] = { 0 }, sb[MAX_NUM] = {0};
     56     
     57         cin >> stra >> strb;
     58         if (N < 2 || N > 35)
     59         {
     60             cout << -1 << endl;
     61             break;
     62         }
     63         if (stra == "" || strb == "")
     64         {
     65             cout << -1 << endl;
     66             break;
     67         }
     68         unsigned long long lena = stra.length();
     69         unsigned long long lenb = strb.length();
     70         reversal(stra,lena);
     71         reversal(strb,lenb);
     72         bool flag1 = mytoInt(stra, sa,lena,N);
     73         bool flag2 = mytoInt(strb, sb,lenb,N);
     74         if (flag1 || flag2)
     75         {
     76             cout << -1 << endl;
     77             break;
     78         }
     79         unsigned long long i, j;
     80         
     81         if (lena > lenb)//a的长度大于等于b
     82         {
     83             i = 0;
     84             for (i = 0; i < lenb; i++)
     85             {
     86                 sa[i] = sa[i] + sb[i];
     87                 sa[i + 1] = sa[i + 1] + sa[i] / N;
     88                 sa[i] = sa[i] % N;
     89             }
     90             while (sa[i] >= N)//a剩下的位数进行调整;高位
     91             {
     92                 if (i == lena - 1)
     93                 {
     94                     int tmp = sa[i] / N;
     95                     sa[i] = sa[i] % N;
     96                     cout << myInttoChar(tmp);
     97                     break;
     98                 }
     99                 sa[i + 1] = sa[i + 1] + sa[i] / N;
    100                 sa[i] = sa[i] % N;
    101                 i++;
    102             }
    103             //输出
    104             unsigned long long max = lena > i ? lena : i;//若最高位有进位则i大
    105             for (int j = max - 1; j >= 0; j--)
    106             {
    107                 cout << myInttoChar(sa[j]);
    108             }
    109             cout << endl;
    110         }
    111         else if (lena < lenb)
    112         {
    113             i = 0;
    114             for (i = 0; i < lena; i++)
    115             {
    116                 sb[i] = sb[i] + sa[i];
    117                 sb[i + 1] = sb[i + 1] + sb[i] / N;
    118                 sb[i] = sb[i] % N;
    119             }
    120             while (sb[i] >= N)
    121             {
    122                 if (i == lenb - 1)
    123                 {
    124                     int tmp = sb[i] / N;
    125                     sb[i] = sb[i] % N;
    126                     cout << myInttoChar(tmp);
    127                     break;
    128                 }
    129                 sb[i + 1] = sb[i + 1] + sb[i] / N;
    130                 sb[i] = sb[i] % N;
    131                 i++;
    132             }
    133             // 输出
    134             unsigned long long max = lenb > i ? lenb : i;//若最高位有进位则i大
    135             for (int j = max - 1; j >= 0; j--)
    136             {
    137                 cout << myInttoChar(sb[j]);
    138             }
    139             cout << endl;
    140         }
    141         else if (lena == lenb)
    142         {
    143             i = 0;
    144             for (i = 0; i < lenb - 1; i++)
    145             {
    146                 sa[i] = sa[i] + sb[i];
    147                 sa[i + 1] = sa[i + 1] + sa[i] / N;
    148                 sa[i] = sa[i] % N;
    149             }
    150             sa[i] = sa[i] + sb[i];
    151             if (sa[i] >= N)
    152             {
    153                 int tmp = sa[i] / N;
    154                 sa[i] = sa[i] % N;
    155                 cout << myInttoChar(tmp);
    156             }
    157             //print
    158             for (int i = lena - 1; i >= 0; i--)
    159             {
    160                 cout << myInttoChar(sa[i]);
    161             }
    162             cout << endl;
    163         }
    164         
    165     }
    166     
    167     return 0;
    168 }
  • 相关阅读:
    取消 Vue 中格式编译警告
    Vue 中提示报错 handlers[i].call is not a function解决方法
    PhpStorm 配置链接远程虚拟机
    Java 类提供了自定义的构造方法,那么类的默认构造不会被调用
    2019.9.30极限测试 04.JAVA语言课堂测试试卷-极限测试
    程序员修炼之道+从小工到专家 9月份读后感
    2019.9.23 作业2
    2019.9.23 作业1
    原码,补码,反码区分
    9.16日上课总结
  • 原文地址:https://www.cnblogs.com/leewhite/p/5338457.html
Copyright © 2011-2022 走看看