Giới thiệu
Trong bài toán này, cho hai số. Cơ số của hai số đó là n. Ta phải tìm kết quả của phép cộng hai số đó trong cơ số n.
Trước tiên, các số được chuyển đổi thành số thập phân. Từ các giá trị thập phân, ta có thể đơn giản cộng chúng. Cuối cùng, số được chuyển đổi lại thành số cơ số n.
Các số cơ số n được cho dưới dạng chuỗi, vì đối với các số có cơ số lớn hơn 9, chúng có thể chứa một số chữ cái để biểu diễn số, như số thập lục phân, có 6 chữ cái (A-F).
Đầu vào và Đầu ra
Đầu vào: Cơ số hệ thống: 16; Số thứ nhất: 2C; Số thứ hai: 5F Đầu ra: Kết quả phép cộng là: 8B
Thuật toán
baseNtoDec(number, base)
Đầu vào: Chuỗi số cơ số N, giá trị cơ số N.
Đầu ra: Giá trị thập phân tương đương của số trong cơ số N.
Begin
len := độ dài của number
power := 1
num := 0
for i := len -1 down to 0, do
if number[i] >= base, then
return invalid number
num := num + number[i] * power
power := power * base
done
return num
End
decToBaseN(dec, base)
Đầu vào: Số thập phân, cơ số N để chuyển đổi số thập phân sang cơ số đó.
Đầu ra: Chuỗi số cơ số N.
Begin
while dec > 0, do
res := nối (dec mod base) với res
dec := dec / base
done
đảo ngược kết quả
return res
End
addBaseN(num1, num2, base)
Đầu vào: Hai số trong cơ số N, giá trị cơ số N.
Đầu ra: Số sau phép cộng trong cơ số N.
Begin
dec1 := baseNtoDec(num1, base)
dec2 := baseNtoDec(num2, base)
sum := decToBaseN(dec1 + dec2, base)
return sum
End
Ví dụ (C++)
#include <iostream>
#include <algorithm>
using namespace std;
int getVal(char c) {
if(c >= '0' && c <= '9')
return int(c-'0'); // giá trị thập phân của số cho trước
else
return int(c-'A'+10); // cho số alphanumeric
}
char revVal(int n) {
if(n >= 0 && n <= 9)
return char(n+'0'); // ký tự giá trị của số cho trước
else
return char(n+'A'-10); // cho số alphanumeric, lấy chữ cái từ thập phân
}
int baseNtoDec(string number, int base) {
int len = number.size();
int power = 1;
int num = 0;
for(int i = len-1; i >= 0; i--) {
// từ chữ số cuối đến chữ số đầu
if(getVal(number[i]) >= base)
return INT_MIN; // khi một chữ số >= base, trả về -vô cực làm lỗi
num += getVal(number[i])*power;
power = power*base;
}
return num;
}
string decToBaseN(int dec, int base) {
string res = ""; // chuỗi rỗng
while(dec > 0) {
res += revVal(dec%base);
dec /= base;
}
reverse(res.begin(), res.end()); // đảo ngược chuỗi để có kết quả cuối
return res;
}
int main() {
int base;
string num1, num2, sum;
cout << "Enter Base: "; cin >> base;
cout << "Enter first number in base " << base << ": "; cin >> num1;
cout << "Enter second number in base " << base << ": "; cin >> num2;
sum = decToBaseN((baseNtoDec(num1, base) + baseNtoDec(num2, base)), base);
cout << "The result of addition is: " << sum;
}
Kết quả
Enter Base: 16 Enter first number in base 16: 2C Enter second number in base 16: 5F The result of addition is: 8B