Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> การเขียนโปรแกรม

การบวกเลขฐาน n


ในปัญหานี้ จะให้ตัวเลขสองตัว ฐานของตัวเลขเหล่านั้นคือ n เราต้องหาผลลัพธ์ของตัวเลขเหล่านั้นหลังจากบวกฐาน n ด้วย

ในตอนแรก ตัวเลขจะถูกแปลงเป็นตัวเลขทศนิยม จากค่าทศนิยม เราสามารถบวกได้ สุดท้าย ตัวเลขจะถูกแปลงเป็นตัวเลขฐาน n อีกครั้ง

เลขฐาน n จะถูกกำหนดเป็นสตริง เนื่องจากสำหรับตัวเลขเหล่านั้นซึ่งมีฐานมากกว่า 9 อาจมีตัวอักษรบางตัวที่ใช้แทนตัวเลข เช่น เลขฐานสิบหก มีตัวอักษร 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.

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(ธ.ค. ฐาน)

ป้อนข้อมูล: เลขฐานสิบ ฐาน 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