📌  相关文章
📜  编写一个程序,以14为底加两个数字

📅  最后修改于: 2021-04-24 15:30:53             🧑  作者: Mango

Anshya询问。
以下是添加基数14的不同方法。
方法1
感谢Raj提出了这种方法。

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

方法二
只需以与在基数10中添加的相同方式在基数14中添加数字即可。从右到左,将两个数字的数字一一对应。如果在加两个数字时有一个进位,请考虑将下一个数字加起来的进位。
让我们考虑与十六进制数字相同的基数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 
using namespace std;
# 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)
    {
        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);
    }
     
    /* 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 = new char[(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 code*/
int main()
{
    char num1[] = "DC2";
    char num2[] = "0A3";
 
    cout<<"Result is "<


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


Java
// Java program for the
// above approach
import java.util.*;
class GFG{
 
// Function to add two
// numbers in base 14
static String sumBase14(char num1[],
                        char num2[])
{
  int l1 = num1.length;
  int l2 = num2.length;
  char []res;
  int i;
  int nml1, nml2, res_nml;
  int carry = 0;
 
  if(l1 != l2)
  {
    System.out.print("Function doesn't support " +
                     "numbers of different " +
                     "lengths. If you want to " +
                     "dd such numbers then " +
                     "prefix smaller number " +
                     "with required no. of zeroes"); 
  }
 
  // 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 = new char[(4 * (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 String.valueOf(res);
 
  // If we have carry after last
  // iteration then result should
  // include 0th character
  res[0] = '1';
  return String.valueOf(res);
}
 
// Function to get value of a numeral
// For example it returns 10 for input
// 'A' 1 for '1', etc
static 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);
  return 0;
}
 
// Function to get numeral
// for a value. For example
// it returns 'A' for input 10
// '1' for 1, etc
static char getNumeral(int val)
{
  if(val >= 0 && val <= 9)
    return (char)(val + '0');
  if(val >= 10 && val <= 14)
    return (char)(val + 'A' - 10);
 
  // If we reach this line
  // caller is giving invalid
  // no. so we assert and fail
  // assert(0);
  return '0';
}
 
// Driver code
public static void main(String[] args)
{
  char num1[] = {'D','C','2'};
  char num2[] = {'0','A','3'};
  System.out.print("Result is " +
                    sumBase14(num1,
                              num2));
}
}
 
// This code is contributed by 29AjayKumar


Python3
# Function to get value of a numeral
# For example it returns 10 for input 'A'
# 1 for '1', etc
def getNumeralValue(num) :
 
    if( num >= '0' and num <= '9') :
        return ord(num) - ord('0')
    if( num >= 'A' and num <= 'D') :
        return ord(num ) - ord('A') + 10
 
# Function to get numeral for a value.
# For example it returns 'A' for input 10
# '1' for 1, etc
def getNumeral(val):
 
    if( val >= 0 and val <= 9):
        return chr(val + ord('0'))
    if( val >= 10 and val <= 14) :
        return chr(val + ord('A') - 10)
 
# Function to add two numbers in base 14
def sumBase14(num1, num2):
 
    l1 = len(num1)
    l2 = len(num2)
    carry = 0
         
    if(l1 != l2) :
     
        print("Function doesn't support numbers of different"
                " lengths. If you want to add such numbers then"
                " prefix smaller number with required no. of zeroes")
     
    # 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 = [0]*(l1 + 1)
             
    # dd all numerals from right to left
    for i in range(l1 - 1, -1, -1):
     
        # 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
 
# Driver code
if __name__ == "__main__":
     
    num1 = "DC2"
    num2 = "0A3"
 
    print("Result is ",end="")
    res = sumBase14(num1, num2)
    for i in range(len(res)):
        print(res[i],end="")
 
# This code is contributed by chitranayal


C#
// C# program for the
// above approach
using System;
class GFG{
 
// Function to add two
// numbers in base 14
static String sumBase14(char []num1,
                        char []num2)
{
  int l1 = num1.Length;
  int l2 = num2.Length;
  char []res;
  int i;
  int nml1, nml2, res_nml;
  int carry = 0;
 
  if(l1 != l2)
  {
    Console.Write("Function doesn't support " +
                  "numbers of different " +
                  "lengths. If you want to " +
                  "dd such numbers then " +
                  "prefix smaller number " +
                  "with required no. of zeroes"); 
  }
 
  // 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 = new char[(4 * (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 String.Join("", res);
 
  // If we have carry after last
  // iteration then result should
  // include 0th character
  res[0] = '1';
  return String.Join("", res);
}
 
// Function to get value of a numeral
// For example it returns 10 for input
// 'A' 1 for '1', etc
static 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);
  return 0;
}
 
// Function to get numeral
// for a value. For example
// it returns 'A' for input 10
// '1' for 1, etc
static char getNumeral(int val)
{
  if(val >= 0 && val <= 9)
    return (char)(val + '0');
  if(val >= 10 && val <= 14)
    return (char)(val + 'A' - 10);
 
  // If we reach this line
  // caller is giving invalid
  // no. so we assert and fail
  // assert(0);
  return '0';
}
 
// Driver code
public static void Main(String[] args)
{
  char []num1 = {'D','C','2'};
  char []num2 = {'0','A','3'};
  Console.Write("Result is " +
                sumBase14(num1,
                          num2));
}
}
 
// This code is contributed by Rajput-Ji


Javascript


输出:

Result is 1085

笔记:
以上方法可用于将数字加到任何基数上。如果基数小于10,则不必进行字符串操作。
您可以尝试将上述程序扩展为不同长度的数字。
如果您发现程序中有任何错误或执行此操作的更好方法,请发表评论。