微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 8位单片机,大数运算,可以运算任意位数的乘除法

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

时间: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] = ;

}

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");

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top