色婷婷AⅤ一区二区三区|亚洲精品第一国产综合亚AV|久久精品官方网视频|日本28视频香蕉

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 8位單片機,大數(shù)運算,可以運算任意位數(shù)的乘除法

          8位單片機,大數(shù)運算,可以運算任意位數(shù)的乘除法

          作者: 時間:2016-11-25 來源:網(wǎng)絡(luò) 收藏
          #include
          #include "stdio.h"
          #include "string.h"
          #include "intrins.h"
          #define BIT 10
          //WriteBy :Rlogin Xukaiming
          void BigNumMul(char szByNum[], char szNum[], char aryResult[])
          {
          int nByNumLen, nNumLen, nTempLen, nResultLen ;
          int i,j,k,l;
          //結(jié)果長度
          nByNumLen = strlen(szByNum);
          nNumLen = strlen(szNum);
          nResultLen = nNumLen+ nByNumLen;
          //乘數(shù)長度從右向左依次
          l = nResultLen-1;
          for (i = nNumLen-1; i >= 0; i--)
          {
          nTempLen = l;
          for (j = nByNumLen-1; j >= 0; j--, nTempLen--)
          {
          //結(jié)果第一次從最后一位開始,第二次從倒數(shù)第二位開始放
          aryResult[nTempLen] = aryResult[nTempLen] + (szNum[i] - 0) * (szByNum[j] -0);
          }
          //進位處理
          for (k = l; k >0; k--) //從后往前處理
          {
          if (aryResult[k] > BIT)
          {
          aryResult[k-1] = aryResult[k-1] + aryResult[k] / BIT;
          aryResult[k] = aryResult[k] % BIT;
          }
          }
          //下一次得從倒數(shù)第二位開始
          l--;
          }
          for(nResultLen=nResultLen-1;nResultLen>=0;nResultLen--) //變成字符串
          {
          aryResult[nResultLen]+=0;
          _nop_();
          }
          _nop_();
          }
          void BigNumDiv(char szByNum[], char szNum[], char quotient[],char **remainder )
          {
          int nByNumLen, nNumLen, nTempLen, nResultLen ;
          int j,k,l=0;
          nByNumLen = strlen(szByNum);
          nNumLen = strlen(szNum);
          nResultLen = nByNumLen - nNumLen+1; //估計商數(shù)的長度
          //將除數(shù)和被除數(shù)變成10進制數(shù)字
          for(j=nByNumLen-1;j>=0;j--)
          {
          szByNum[j] -=0;
          }
          for(j=nNumLen-1;j>=0;j--)
          {
          szNum[j] -= 0;
          }
          ///////////////////////////////除法就是減法 ?
          for(j=nResultLen-1;j>=0;j--)
          {
          quotient[l]=0;
          while(1)
          {
          quotient[l]++; //商數(shù)加1
          for(k=nNumLen-1;k>=0;k--) //減除數(shù)的長度即可
          {
          szByNum[k+l]-=szNum[k]; //減掉除數(shù)
          if(szByNum[k+l]<0)
          {
          //if((l!=0)||(k+l>1)) //第一次防止借位借到-1位
          if(k+l>0)
          {
          szByNum[k+l-1]-=1; //借位=10
          szByNum[k+l]+=BIT;
          }
          }
          } //(szByNum[0]<0)||(
          if(((l==0)&&(szByNum[l]<0)) //符號判斷,看有負數(shù)沒?
          ||((l>0)&&(szByNum[l-1]<0)))
          {
          quotient[l]--;
          for(k=nNumLen-1;k>=0;k--)
          {
          szByNum[k+l]+=szNum[k]; //變成了負數(shù),要加回來
          if(szByNum[k+l]>=BIT)
          {
          if(k+l>0) //第一次防止借位借到-1位
          {
          szByNum[k+l-1]+=1;
          szByNum[k+l]-=BIT;
          }
          }
          }
          _nop_();
          break;
          }
          }
          quotient[l]+=0; //轉(zhuǎn)為ASCII
          l++;
          }
          for(j=l;j
          {
          szByNum[j]+=0;
          }
          *remainder = &szByNum[l];
          quotient[l] =