Method 1
Thanks to Raj for suggesting this method.

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

Method 2
Just add the numbers in base 14 in same way we add in base 10. Add numerals of both numbers one by one from right to left. If there is a carry while adding two numerals, consider the carry for adding next numerals.

Let us consider the presentation of base 14 numbers same as hexadecimal numbers

   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
[ad type=”banner”]

Implementation of Method 2:

C
# include <stdio.h>
# include <stdlib.h>
# define bool int
 
int getNumeralValue(char );
char getNumeral(int );
 
/* Function to add two numbers in base 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);
   }      
 
   /* Note the size of the allocated memory is one 
     more than i/p lenghts for the cases where we 
     have carry at the last like adding D1 and A1 */  
   res = (char *)malloc(sizeof(char)*(l1 + 1));
       
   /* Add all numerals from right to left */
   for(i = l1-1; i >= 0; i--)
   {
     /* Get decimal values of the numerals of 
       i/p numbers*/         
     nml1 = getNumeralValue(num1[i]);
     nml2 = getNumeralValue(num2[i]);
      
     /* Add decimal values of numerals and carry */
     res_nml = carry + nml1 + nml2;
      
     /* Check if we have carry for next addition 
        of numerals */
     if(res_nml >= 14)
     {
       carry = 1;
       res_nml -= 14;
     }   
     else
     {
       carry = 0;     
     }       
     res[i+1] = getNumeral(res_nml);
   }
       
   /* if there is no carry after last iteration 
      then result should not include 0th character 
      of the resultant string */
   if(carry == 0)
     return (res + 1);   
 
   /* if we have carry after last iteration then 
     result should include 0th character */
   res[0] = '1';
   return res;
}
 
/* Function to get value of a numeral 
  For example it returns 10 for input 'A' 
  1 for '1', etc */
int getNumeralValue(char num)
{
  if( num >= '0' && num <= '9')
    return (num - '0');
  if( num >= 'A' && num <= 'D')  
    return (num - 'A' + 10);
         
  /* If we reach this line caller is giving 
    invalid character so we assert and fail*/ 
  assert(0);
}
 
/* Function to get numeral for a value.   
  For example it returns 'A' for input 10 
  '1' for 1, etc */
char getNumeral(int val)
{
  if( val >= 0 && val <= 9)
    return (val + '0');
  if( val >= 10 && val <= 14)  
    return (val + 'A' - 10);
     
  /* If we reach this line caller is giving 
    invalid no. so we assert and fail*/     
  assert(0);
}
 
/*Driver program to test above functions*/
int main()
{
    char *num1 = "DC2";
    char *num2 = "0A3";
 
    printf("Result is %s", sumBase14(num1, num2));     
    getchar();
    return 0;
}