新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 8位單片機,大數運算,可以運算任意位數的乘除法

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

        作者: 時間:2016-11-25 來源:網絡 收藏
        #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;
        //結果長度
        nByNumLen = strlen(szByNum);
        nNumLen = strlen(szNum);
        nResultLen = nNumLen+ nByNumLen;
        //乘數長度從右向左依次
        l = nResultLen-1;
        for (i = nNumLen-1; i >= 0; i--)
        {
        nTempLen = l;
        for (j = nByNumLen-1; j >= 0; j--, nTempLen--)
        {
        //結果第一次從最后一位開始,第二次從倒數第二位開始放
        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;
        }
        }
        //下一次得從倒數第二位開始
        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; //估計商數的長度
        //將除數和被除數變成10進制數字
        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]++; //商數加1
        for(k=nNumLen-1;k>=0;k--) //減除數的長度即可
        {
        szByNum[k+l]-=szNum[k]; //減掉除數
        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)) //符號判斷,看有負數沒?
        ||((l>0)&&(szByNum[l-1]<0)))
        {
        quotient[l]--;
        for(k=nNumLen-1;k>=0;k--)
        {
        szByNum[k+l]+=szNum[k]; //變成了負數,要加回來
        if(szByNum[k+l]>=BIT)
        {
        if(k+l>0) //第一次防止借位借到-1位
        {
        szByNum[k+l-1]+=1;
        szByNum[k+l]-=BIT;
        }
        }
        }
        _nop_();
        break;
        }
        }
        quotient[l]+=0; //轉為ASCII
        l++;
        }
        for(j=l;j
        {
        szByNum[j]+=0;
        }
        *remainder = &szByNum[l];
        quotient[l] = 主站蜘蛛池模板: 西贡区| 磐石市| 阳谷县| 铜山县| 清流县| 双辽市| 驻马店市| 定结县| 舒兰市| 衡南县| 大洼县| 抚州市| 西吉县| 新绛县| 富阳市| 涪陵区| 惠水县| 东海县| 来宾市| 名山县| 嵩明县| 平安县| 巧家县| 博爱县| 林西县| 偏关县| 澜沧| 瓮安县| 巢湖市| 游戏| 宣恩县| 五大连池市| 禹城市| 高安市| 东乌珠穆沁旗| 新津县| 文成县| 琼结县| 二连浩特市| 鄄城县| 兴海县|