任意进制数的加法

实现一个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 }

 

转载于:https://www.cnblogs.com/leewhite/p/5338457.html

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的 C++ 代码示例,用于将任意的数字转换为十,并实现基本的加法、减法、乘法和除法运算。 ```cpp #include <iostream> #include <string> using namespace std; // 将 n 的数 s 转换为十 int toDecimal(string s, int n) { int res = 0; for (int i = 0; i < s.length(); i++) { if (s[i] >= '0' && s[i] <= '9') { res = res * n + (s[i] - '0'); } else { res = res * n + (s[i] - 'A' + 10); } } return res; } // 将十数 x 转换为 n string toBase(int x, int n) { string res = ""; while (x) { int r = x % n; if (r <= 9) { res = char(r + '0') + res; } else { res = char(r - 10 + 'A') + res; } x /= n; } return res; } // 实现任意数的加法 string add(string a, string b, int n) { int carry = 0; int i = a.length() - 1, j = b.length() - 1; string res = ""; while (i >= 0 || j >= 0 || carry) { int x = (i >= 0 ? a[i--] - '0' : 0); int y = (j >= 0 ? b[j--] - '0' : 0); int sum = x + y + carry; carry = sum / n; sum %= n; res = char(sum + '0') + res; } return res; } // 实现任意数的减法 string sub(string a, string b, int n) { int borrow = 0; int i = a.length() - 1, j = b.length() - 1; string res = ""; while (i >= 0 || j >= 0) { int x = (i >= 0 ? a[i--] - '0' : 0); int y = (j >= 0 ? b[j--] - '0' : 0); int diff = x - y - borrow; if (diff < 0) { diff += n; borrow = 1; } else { borrow = 0; } res = char(diff + '0') + res; } // 去掉前导零 while (res.length() > 1 && res[0] == '0') { res.erase(0, 1); } return res; } // 实现任意数的乘法 string mul(string a, string b, int n) { string res = ""; int len = a.length() + b.length(); int *c = new int[len]; for (int i = 0; i < len; i++) { c[i] = 0; } for (int i = a.length() - 1; i >= 0; i--) { for (int j = b.length() - 1; j >= 0; j--) { int x = a[i] - '0'; int y = b[j] - '0'; int sum = x * y + c[i + j + 1]; c[i + j + 1] = sum % n; c[i + j] += sum / n; } } int i = 0; while (i < len - 1 && c[i] == 0) { i++; } for (; i < len; i++) { res += char(c[i] + '0'); } return res; } // 实现任意数的除法 string div(string a, string b, int n) { string res = ""; int m = a.length(), n = b.length(); int *A = new int[m]; int *B = new int[n]; int *C = new int[m]; int *R = new int[n]; for (int i = 0; i < m; i++) { A[i] = a[i] - '0'; C[i] = 0; } for (int i = 0; i < n; i++) { B[i] = b[i] - '0'; } for (int i = m - n; i >= 0; i--) { int d = 0; while (compare(A + i, B, n) >= 0) { sub(A + i, B, n); d++; } C[i] = d; } int i = 0; while (i < m && C[i] == 0) { i++; } for (; i < m; i++) { res += char(C[i] + '0'); } return res; } // 比较两个任意数的大小 int compare(int *A, int *B, int n) { for (int i = 0; i < n; i++) { if (A[i] > B[i]) { return 1; } else if (A[i] < B[i]) { return -1; } } return 0; } int main() { string s = "1010"; int n = 2; cout << toDecimal(s, n) << endl; int x = 10; int m = 2; cout << toBase(x, m) << endl; string a = "1101"; string b = "101"; cout << add(a, b, 2) << endl; cout << sub(a, b, 2) << endl; cout << mul(a, b, 2) << endl; cout << div(a, b, 2) << endl; return 0; } ``` 请注意,此代码示例仅适用于非负整数和较小的数字。在实际应用中,您可能需要考虑更多的边界情况和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值