Рубрики

Напишите программу для добавления двух чисел в базу 14

На вопрос Аньши.

Ниже приведены различные способы добавления базовых 14 чисел.


Способ 1
Спасибо Раджу за предложение этого метода.

  1. Convert both i/p base 14 numbers to base 10.
  2. Add numbers.
  3. Convert the result back to base 14.

Способ 2
Просто добавьте числа в базе 14 таким же образом, как мы добавляем в базу 10. Добавьте цифры обоих чисел один за другим справа налево. Если при добавлении двух чисел есть перенос, рассмотрите перенос для добавления следующих чисел.

Давайте рассмотрим представление базовых 14 чисел, таких же, как шестнадцатеричные числа

   A --> 10
   B --> 11
   C --> 12
   D --> 13
Example:
   num1 =       1  2  A
   num2 =       C  D  3   

   1. Add A and 3, we get 13(D). Since 13 is smaller than 
14, carry becomes 0 and resultant numeral becomes D         

  2. Add 2, D and carry(0). we get 15. Since 15 is greater 
than 13, carry becomes 1 and resultant numeral is 15 - 14 = 1

  3. Add 1, C and carry(1). we get 14. Since 14 is greater 
than 13, carry becomes 1 and resultant numeral is 14 - 14 = 0

Finally, there is a carry, so 1 is added as leftmost numeral and the result becomes 
101D 

Реализация метода 2

C ++

#include <bits/stdc++.h>

using namespace std;

# define bool int 

  

int getNumeralValue(char ); 

char getNumeral(int ); 

  
/ * Функция добавления двух чисел в базу 14 * /

char *sumBase14(char num1[], char num2[]) 

    int l1 = strlen(num1); 

    int l2 = strlen(num2); 

    char *res; 

    int i; 

    int nml1, nml2, res_nml; 

    bool carry = 0; 

          

    if(l1 != l2) 

    

        cout << "Function doesn't support numbers of different"

                " lengths. If you want to add such numbers then"

                " prefix smaller number with required no. of zeroes"

        assert(0); 

    

      

    / * Обратите внимание, что размер выделенной памяти равен одному

        больше, чем I / P длины для случаев, когда мы

        иметь перенос в конце, как добавление D1 и A1 * /

    res = new char[(sizeof(char)*(l1 + 1))]; 

              

    / * Добавить все цифры справа налево * /

    for(i = l1-1; i >= 0; i--) 

    

        / * Получить десятичные значения чисел

        номера i / p * /    

        nml1 = getNumeralValue(num1[i]); 

        nml2 = getNumeralValue(num2[i]); 

          

        / * Добавить десятичные значения чисел и переносить * /

        res_nml = carry + nml1 + nml2; 

          

        / * Проверьте, есть ли у нас кэрри для следующего дополнения

            цифр * /

        if(res_nml >= 14) 

        

            carry = 1; 

            res_nml -= 14; 

        

        else

        

               carry = 0; 

        

        res[i+1] = getNumeral(res_nml); 

    

          

    / * если после последней итерации нет переноса

        тогда результат не должен содержать 0-й символ

        результирующей строки * /

    if(carry == 0) 

        return (res + 1); 

      

    / * если у нас есть перенос после последней итерации, то

        результат должен содержать 0-й символ * /

    res[0] = '1'

    return res; 

  
/ * Функция для получения значения числа
Например, он возвращает 10 для ввода «А»
1 для «1» и т. Д. * /

int getNumeralValue(char num) 

    if( num >= '0' && num <= '9'

        return (num - '0'); 

    if( num >= 'A' && num <= 'D'

        return (num - 'A' + 10); 

              

    / * Если мы дойдем до этой линии, вызывающая сторона дает

        неверный символ, поэтому мы утверждаем и терпим неудачу * /

    assert(0); 

  
/ * Функция для получения числового значения.
Например, он возвращает «А» для ввода 10
«1» для 1 и т. Д. * /

char getNumeral(int val) 

    if( val >= 0 && val <= 9) 

        return (val + '0'); 

    if( val >= 10 && val <= 14) 

        return (val + 'A' - 10); 

          

    / * Если мы дойдем до этой линии, вызывающая сторона дает

        неверный номер поэтому мы утверждаем и терпим неудачу * /

    assert(0); 

  
/ * Код водителя * /

int main() 

    char num1[] = "DC2"

    char num2[] = "0A3"

  

    cout<<"Result is "<<sumBase14(num1, num2); 

    return 0; 

  
// Этот код предоставлен rathbhupendra

С

# include <stdio.h>
# include <stdlib.h>
# define bool int

  

int getNumeralValue(char );

char getNumeral(int );

  
/ * Функция добавления двух чисел в базу 14 * /

char *sumBase14(char *num1,  char *num2)

{

   int l1 = strlen(num1);

   int l2 = strlen(num2);  

   char *res; 

   int i;

   int nml1, nml2, res_nml;   

   bool carry = 0;

     

   if(l1 != l2)

   {

     printf("Function doesn't support numbers of different"

            " lengths. If you want to add such numbers then"

            " prefix smaller number with required no. of zeroes"); 

     getchar();         

     assert(0);

   }      

  

   / * Обратите внимание, что размер выделенной памяти равен одному

     больше, чем I / P длины для случаев, когда мы

     иметь перенос в конце, как добавление D1 и A1 * /   

   res = (char *)malloc(sizeof(char)*(l1 + 1));

        

   / * Добавить все цифры справа налево * /

   for(i = l1-1; i >= 0; i--)

   {

     / * Получить десятичные значения чисел

       номера i / p * /          

     nml1 = getNumeralValue(num1[i]);

     nml2 = getNumeralValue(num2[i]);

       

     / * Добавить десятичные значения чисел и переносить * /

     res_nml = carry + nml1 + nml2;

       

     / * Проверьте, есть ли у нас кэрри для следующего дополнения

        цифр * /

     if(res_nml >= 14)

     {

       carry = 1;

       res_nml -= 14;

     }   

     else 

     {

       carry = 0;     

     }       

     res[i+1] = getNumeral(res_nml);

   }

        

   / * если после последней итерации нет переноса

      тогда результат не должен содержать 0-й символ

      результирующей строки * /

   if(carry == 0)

     return (res + 1);   

  

   / * если у нас есть перенос после последней итерации, то

     результат должен содержать 0-й символ * /

   res[0] = '1';

   return res;

}

  
/ * Функция для получения значения числа

  Например, он возвращает 10 для ввода «А»

  1 для «1» и т. Д. * /

int getNumeralValue(char num)

{

  if( num >= '0' && num <= '9')

    return (num - '0');

  if( num >= 'A' && num <= 'D')  

    return (num - 'A' + 10);

          

  / * Если мы дойдем до этой линии, вызывающая сторона дает

    неверный символ, поэтому мы утверждаем и терпим неудачу * /  

  assert(0);

}

  
/ * Функция для получения числового значения.

  Например, он возвращает «А» для ввода 10

  «1» для 1 и т. Д. * /

char getNumeral(int val)

{

  if( val >= 0 && val <= 9)

    return (val + '0');

  if( val >= 10 && val <= 14)  

    return (val + 'A' - 10);

      

  / * Если мы дойдем до этой линии, вызывающая сторона дает

    неверный номер поэтому мы утверждаем и терпим неудачу * /      

  assert(0);

}

  
/ * Программа драйвера для проверки вышеуказанных функций * /

int main()

{

    char *num1 = "DC2";

    char *num2 = "0A3";

  

    printf("Result is %s", sumBase14(num1, num2));     

    getchar();

    return 0;

}


Выход:

Result is 1085

Примечания:
Вышеуказанный подход можно использовать для добавления чисел в любую базу. Нам не нужно выполнять строковые операции, если base меньше 10.

Вы можете попробовать расширить вышеуказанную программу для чисел различной длины.

Пожалуйста, прокомментируйте, если вы обнаружите какую-либо ошибку в программе или лучший способ сделать то же самое.

Рекомендуемые посты:

Напишите программу для добавления двух чисел в базу 14

0.00 (0%) 0 votes