×
嵌入式 > 技术百科 > 详情

8位单片机,大数运算,可以运算任意位数的乘除法

发布时间:2020-06-20 发布时间:
|
#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] = '';
 
}
[page]
 
xdata char strByNum[8], strNum[8];          
 
xdata char arrayResult[50] = {0};
 
 
xdata char arrayquotient[8];
 
xdata char *arrayremainder;
 
 
int main()
 
{
 
 
    int i;
 
 
        TH1 = 0xFE;
 
        TR1 = 1;
 
    TI = 1;
 
 
    //printf("请输入被乘数: ");
 
        strcpy(strByNum,"9000");                         
 
    printf(" 被除数: ");
 
        printf(strByNum);
 
        strcpy(strNum,"299");
 
        printf(" 除数: ");
 
        printf(strNum);                
        //strcpy(arrayquotient,"123");
 
        memset(arrayResult,0,sizeof(arrayResult));            
 
    //BigNumMul(strByNum, strNum, arrayResult);         
 
           BigNumDiv(strByNum, strNum, arrayquotient,&arrayremainder);         
 
    printf(" 商数: ");
 
    printf(arrayquotient); 
        printf(" 余数: ");
 
        printf(arrayremainder); 
    printf(" ");        
        while(1);          
 
    return 0;
 
}
 
输入输出均为10进制 字符串

应用范围 ,加密解密,DDS的超长的除法
 
 
这是一个C语言版本,只供学习参考,实际使用可找汇编版本。。。字符串法!!!




『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
ADI 高精度低功耗精密放大器