任意进制计算器 c++
时间: 2023-10-18 19:08:35 浏览: 115
以下是一个简单的 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;
}
```
请注意,此代码示例仅适用于非负整数和较小的数字。在实际应用中,您可能需要考虑更多的边界情况和优化。