兩個大的正整數相加之和(C語言實現)


typedef unsigned char BYTE;

// BCD 碼串字節序反轉
void ReverseNum(BYTE* num, int cnt);

/*
兩個大的正整數相加之和, 其中:
參數:
   num1     整數的BCD碼串1
   size1    BCD碼串1的字節數
   num2     整數的BCD碼串2
   size2    BCD碼串2的字節數
   dest     存放結果BCD碼串的緩沖區
   size     傳入 dest 緩沖區的尺寸
返回值:
   -3       相加失敗, 參數不合法
   -2       相加失敗, BCD碼串2存在不合法字符
   -1       相加失敗, BCD碼串1存在不合法字符
    0       相加失敗, 結果BCD碼串的緩沖區尺寸太小
   >0       相加成功, 返回BCD碼串的字節數
*/
int AddBCDInt(const void* num1, int size1, const void* num2, int size2,
                    void* dest, int size)
{
   int result  = -3;
   int nCnt    = 0;  // 返回字節數
   BYTE btNum1 = 0, btNum2 = 0, btDestNum = 0;
   BYTE btHighNum1  = 0, btLowNum1 = 0; 
   BYTE btHighNum2  = 0, btLowNum2 = 0; 
   BYTE btHighNum   = 0, btLowNum  = 0; 
   BYTE num1Size    = 0, num2Size  = 0;   // 截掉首字節為0后num1,num2的真實size
   int maxSize      = 0;
   BYTE carryFlag   = 0; // 進位標記

   // 參數合法性判定
   if ( num1!=NULL && size1>0 && num2!=NULL && size2>0 && dest!=NULL && size>0 )
   {
      num1Size = size1;
      num2Size = size2;
      //  截掉num1\num2為0首字節
      for ( int i=0; i<size1; i++ )
      {
         if (  ((BYTE *)num1)[i] == 0  )  num1Size --;
         else  break;
      }

      for ( int i=0; i<size2; i++ )
      {
         if (  ((BYTE *)num2)[i] == 0  )  num2Size --;
         else  break;
      }

      maxSize = (num1Size>num2Size) ? (num1Size+1) : (num2Size+1); // 相加結果最大字節數maxSize
      while( maxSize-- > 0 )
      {
         // num1
         if ( size1 > 0 )
         {
            btNum1 = ( (BYTE *)num1 )[--size1];
            btLowNum1  = btNum1 & 0x0F;
            btHighNum1 = btNum1 >> 4;

            // btNum1高低位合法性驗證
            if ( btLowNum1>9 || btHighNum1>9 )
            {
               result = -1;  // 相加失敗, BCD碼串1存在不合法字符
               break;
            }
         }
         else
         {
            btNum1 = 0;
            btLowNum1  = 0;
            btHighNum1 = 0;
         }
         // num2
         if ( size2 > 0 )
         {
            btNum2 = ( (BYTE *)num2 )[--size2];
            btLowNum2  = btNum2 & 0x0F;
            btHighNum2 = btNum2 >> 4;

            // btNum2高低位合法性驗證
            if ( btLowNum2>9 || btHighNum2>9 )
            {
               result = -2;  // 相加失敗, BCD碼串2存在不合法字符
               break;
            }
         }
         else
         {
            btNum2 = 0;
            btLowNum2  = 0;
            btHighNum2 = 0;

         }
         // 字符合法
         btLowNum  = btLowNum1  + btLowNum2;
         btHighNum = btHighNum1 + btHighNum2;
         
         btLowNum += carryFlag;  // 進位
         if ( btLowNum>9 )            // 進位加6修正
         {
            btLowNum -= 10;
            btHighNum++;
         }

         // 低位修正結果使高位大於9時,高位進行加6修正
         if ( btHighNum > 9 )
         {
            btHighNum += 6;
            carryFlag = 1;
         }
         else
            carryFlag = 0;
			
         btDestNum = (btHighNum << 4) + btLowNum;
         if ( btDestNum != 0 || maxSize > 0 )
         {
            if ( size > nCnt )
            {
               ( (BYTE *)dest )[nCnt++] = btDestNum;
               result = nCnt;
            }
            else
            {
               result = 0;  // 相加失敗, 結果BCD碼串的緩沖區尺寸太小
               break;
            }  
         }
      }

      // BCD 碼串按十進制數的從高到低存放
      if ( result > 0 )
      {
         ReverseNum((BYTE *)dest , nCnt);
      }
   }
   return result;
}

/*
兩個大的正整數相加之和, 其中:
參數:
   num      整數的BCD碼串
   cnt      BCD碼串的字節數
返回值:
   無
*/
void ReverseNum(BYTE* num, int cnt)
{
   BYTE tmp;
   for ( int i = 0; i < (cnt/2); i++ )
   {
      tmp = num[i];
      num[i] = num[cnt-1-i];
      num[cnt-1-i] = tmp;
   }
}

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM