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 }
  • 相关阅读:
    Python基础语法 第2节课(数据类型转换、运算符、字符串)
    python基础语法 第5节课 ( if 、 for )
    python基础语法 第4节课 (字典 元组 集合)
    Python基础语法 第3节课 (列表)
    A. Peter and Snow Blower 解析(思維、幾何)
    C. Dima and Salad 解析(思維、DP)
    D. Serval and Rooted Tree (樹狀DP)
    C2. Balanced Removals (Harder) (幾何、思維)
    B. Two Fairs 解析(思維、DFS、組合)
    D. Bash and a Tough Math Puzzle 解析(線段樹、數論)
  • 原文地址:https://www.cnblogs.com/leewhite/p/5338457.html
Copyright © 2011-2022 走看看