Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Lập Trình

Cộng hai số cơ số n (Adding base n numbers)


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