|
- #include <REGX52.H>
- #include "stdio.h"
- #include "string.h"
- #include "intrins.h"
- #define BIT 10
- //WriteBy :Rlogin Xukaiming
- /************************************************************************
- 函数功能: 大数计算
- 参数1: char szByNum[] //被乘数
- 参数2: char szNum[] //乘数
- 参数3: char aryResult[] //积 用来放结果
- ************************************************************************/
- 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_();
- }
- /************************************************************************
- 函数功能: 大数计算
- 参数1: char szByNum[] //被除数
- 参数2: char szNum[] //乘数
- 参数3: char aryResult[] //商 用来放结果
- 参数4: char remainder[] //余数 用来放结果
- ************************************************************************/
- 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<nByNumLen-1;j++)
- {
- szByNum[j]+='0';
- }
- *remainder = &szByNum[l];
- quotient[l] = '\0';
- }
- 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("\n被除数: ");
- printf(strByNum);
- strcpy(strNum,"299");
- printf("\n除数: ");
- printf(strNum);
- //strcpy(arrayquotient,"123");
- memset(arrayResult,0,sizeof(arrayResult));
- //BigNumMul(strByNum, strNum, arrayResult);
- BigNumDiv(strByNum, strNum, arrayquotient,&arrayremainder);
- printf("\n商数: ");
- printf(arrayquotient);
- printf("\n余数: ");
- printf(arrayremainder);
- printf("\r\n");
- while(1);
- return 0;
- }
复制代码 输入输出均为10进制 字符串
应用范围 ,加密解密,DDS的超长的除法 |
|