이 문제에서는 두 개의 숫자가 제공됩니다. 그 숫자의 밑은 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