Computer >> Máy Tính >  >> Lập trình >> Lập trình

Thêm n số cơ sở


Trong bài toán này, hai số được đưa ra. Cơ số của các số đó là n. Chúng ta phải tìm kết quả của số đó sau khi cộng với cơ số n.

Lúc đầu, các con số được chuyển thành số thập phân. Từ các giá trị thập phân, chúng ta có thể thêm chúng một cách đơn giản. Cuối cùng, các số lại được chuyển đổi thành số cơ số n.

N số cơ sở được cung cấp dưới dạng một chuỗi, vì đối với những số có cơ số lớn hơn 9, nó có thể chứa một số bảng chữ cái để biểu thị số, chẳng hạn như số thập lục phân, có 6 chữ cái (A-F).

Đầu vào và Đầu ra

Input: 
The base of a number system: 16
First number 2C
Second number 5F
Output:
The result of addition is: 8B

Thuật toán

baseNtoDec (số, cơ sở)

Đầu vào - Chuỗi số của cơ số N, giá trị của cơ số N.

Đầu ra - Tương đương thập phân của số trong cơ số N.

Begin
   len := length of 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 một số thập phân sang cơ số đó.

Đầu ra: Chuỗi số của cơ sở N.

Begin
   while dec > 0, do
      res := concatenate (dec mod base) with res
      dec := dec / base
   done

   reverse the result
   return res
End

addBaseN (num1, num2, base)

Đầu vào: Hai số trong cơ số N, giá trị của cơ số N.

Đầu ra: Số sau khi 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ụ

#include<iostream>
#include<algorithm>
using namespace std;

int getVal(char c) {
   if(c >= '0' && c<='9')
      return int(c-'0');    //decimal value of given number
   else
      return int(c-'A'+10);    //for Alphanumeric numbers
}

char revVal(int n) {
   if(n >= 0 && n <=9)
      return char(n+'0');    //character value of given number
   else
      return char(n+'A'-10);    //for Alphanumeric numbers, get alphabet from decimal
}

int baseNtoDec(string number, int base) {
   int len = number.size();
   int power = 1;
   int num = 0;

   for(int i = len-1; i>= 0; i--) {    //from last digit to first digit
      if(getVal(number[i]) >= base)
         return INT_MIN;    //when a digit is >= base, return -ve infinity as error
      num += getVal(number[i])*power;
      power = power*base;
   }
   return num;
}

string decToBaseN(int dec, int base) {
   string res = "";    //empty string
   while(dec > 0) {
      res += revVal(dec%base);
      dec /= base;
   }

   reverse(res.begin(), res.end());    //reverse the string to get final answer
   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;
}

Đầu ra

Enter Base: 16
Enter first number in base 16: 2C
Enter second number in base 16: 5F
The result of addition is: 8B