Computer >> 컴퓨터 >  >> 프로그램 작성 >> 프로그램 작성

n 밑수 더하기


이 문제에서는 두 개의 숫자가 제공됩니다. 그 숫자의 밑은 n입니다. 우리는 n진법에서도 덧셈을 한 후 그 숫자의 결과를 찾아야 합니다.

처음에는 숫자가 십진수로 변환됩니다. 십진수 값에서 간단히 더할 수 있습니다. 마지막으로 숫자는 다시 n진수로 변환됩니다.

n개의 기수는 문자열로 주어집니다. 기수가 9보다 큰 숫자의 경우 16진수와 같이 숫자를 나타내는 일부 알파벳이 포함될 수 있으므로 6개의 문자(A-F)가 있기 때문입니다.

입력 및 출력

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

알고리즘

baseNtoDec(숫자, 밑수)

입력 - N 밑의 숫자 스트링, N 밑의 값.

출력 - N 밑의 숫자에 해당하는 10진수.

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)

입력: 십진수, 기본 N은 십진수를 해당 기본으로 변환합니다.

출력: 기본 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)

입력: N 밑의 두 숫자, N 밑의 값.

출력: N 밑수에서 더한 후의 숫자입니다.

Begin
   dec1 := baseNtoDec(num1, base)
   dec2 := baseNtoDec(num2, base)
   sum := decToBaseN(dec1 + dec2, base)
   return sum
End

예시

#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;
}

출력

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