大数运算——加法,减法,乘法 .

来源:互联网 发布:单片机教材 编辑:程序博客网 时间:2024/04/28 13:05
 

尝试实现了下大数运算的代码。

原理就是用int型数组模拟一个大数的每个位。

数组的[0]对应的大数的个位。

 

 

具体代码如下,主要考虑大于10的元素要进位,负数要借位。

 

view plaincopy to clipboardprint?
  1. #include <iostream>   
  2. #include <algorithm>   
  3. #include <stdio.h>   
  4. #include <string.h>   
  5.   
  6. using namespace std;  
  7.   
  8. #define MAX_DIGIT 500   
  9.   
  10. //大数运算:加法   
  11. int Multiply(int *a,int *b,int *&result);  
  12. //大数运算:乘法   
  13. int Add(int *a,int *b,int *&result);  
  14. //大数运算:减法   
  15. int Sub(int *a,int *b,int *&result);  
  16.   
  17. //逐位调整大数,如result为11 9 22 -3 -2调整为:1 0 3 9 -3,然后再对符号提升到最高位: 9 9 6 0 2... ... -1  
  18. //表示大数的值为-20699   
  19. void AjustEncodeArray(int *&result,unsigned int iMaxNum);  
  20.   
  21. //输出大数   
  22. void PrintBigNum(int *result);  
  23.   
  24. //把个位在高位的字符数组转为个位在低位(下标0)的整型数组   
  25. void CArray2revDigitArray(char *cArray,int *DigitArray,unsigned int iNum);  
  26.   
  27. //大数运算:加法   
  28. int Add(int *a,int *b,int *&result)  
  29. {  
  30.     if(a==NULL || b==NULL || result==NULL)  
  31.     {  
  32.         printf("multiply:input error/n");  
  33.         return -1;  
  34.     }  
  35.     int i=0,j=0;  
  36.     //初始化result数组   
  37.     for(i=0;i<MAX_DIGIT*2;++i)  
  38.     {  
  39.         result[i]=0;  
  40.     }  
  41.     for(i=0;i<MAX_DIGIT;++i)  
  42.     {  
  43.         result[i] += (a[i]+b[i]);  
  44.     }  
  45.     AjustEncodeArray(result,MAX_DIGIT*2);  
  46.     return 0;  
  47. }  
  48.   
  49. //大数运算:减法   
  50. int Sub(int *a,int *b,int *&result)  
  51. {  
  52.     if(a==NULL || b==NULL || result==NULL)  
  53.     {  
  54.         printf("multiply:input error/n");  
  55.         return -1;  
  56.     }  
  57.     int i=0,j=0;  
  58.     //初始化result数组   
  59.     for(i=0;i<MAX_DIGIT*2;++i)  
  60.     {  
  61.         result[i]=0;  
  62.     }  
  63.     for(i=0;i<MAX_DIGIT;++i)  
  64.     {  
  65.         result[i] += (a[i]-b[i]);             //result里可以为负数  
  66.     }  
  67.     AjustEncodeArray(result,MAX_DIGIT*2);  
  68.     return 0;  
  69. }  
  70.   
  71. //大数乘法   
  72. int Multiply(int *a,int *b,int *&result)  
  73. {  
  74.     if(a==NULL || b==NULL || result==NULL)  
  75.     {  
  76.         printf("multiply:input error/n");  
  77.         return -1;  
  78.     }  
  79.     int i=0,j=0;  
  80.     //初始化result数组   
  81.     for(i=0;i<MAX_DIGIT*2;++i)  
  82.     {  
  83.         result[i]=0;  
  84.     }  
  85.     //a[0]为个位起算,结果的偏移位为i+j,   
  86.     //如个位*十位,则运算结果的偏移为0+1即1   
  87.     //例子:a[0]为9,b[1]为7,则result[1]加63  
  88.     for(i=0;i<MAX_DIGIT;++i)  
  89.     {  
  90.         for(j=0;j<MAX_DIGIT;++j)  
  91.         {  
  92.             result[i+j] += a[i]*b[j];  
  93.         }  
  94.     }  
  95.     AjustEncodeArray(result,MAX_DIGIT*2);  
  96.     return 0;  
  97. }  
  98.   
  99.   
  100. //逐位调整大数,如result为11 9 22 -3 -2调整为:1 0 3 9 -3,然后再对符号提升到最高位: 9 9 6 0 2... ... -1  
  101. //表示大数的值为-20699   
  102. void AjustEncodeArray(int *&result,unsigned int iMaxNum)  
  103. {  
  104.     int i = 0;  
  105.     unsigned int iNumFlag = 0;  
  106.     unsigned int iWeight = 0;            //有效最高位的权值  
  107.     //遍历找出有效数据的最高位的下标(正负都有可能)   
  108.     for(i=iMaxNum-1;i>=0;--i)  
  109.     {  
  110.          if(result[i]!=0)  
  111.         {  
  112.             iNumFlag=i;  
  113.             break;  
  114.         }  
  115.     }  
  116.     //从低位开始往上调整,规则:大于10的正数要进位,负数要借位   
  117.     for(i=0;i<iNumFlag;++i)  
  118.     {  
  119.         //进位   
  120.         if(result[i]>0)  
  121.         {  
  122.             result[i+1] += result[i]/10;        //十位以上都要进位  
  123.             result[i] = result[i]%10;           //调整进位后的当前位  
  124.         }  
  125.         else if(result[i]<0)  
  126.         {  
  127.             result[i+1] -= 1;        //忽略高位是否可借位,强行借位  
  128.             result[i] = 10+result[i];  
  129.         }  
  130.     }  
  131.     //若有效最高位为负数,需要对负号进行提升,就是对高位与余下低位进行一次减法  
  132.     if(result[iNumFlag]<0)  
  133.     {  
  134.         iWeight = -result[iNumFlag];  
  135.         int iMinuend[2*MAX_DIGIT]={0};  
  136.         iMinuend[iNumFlag] = iWeight;          //被减数  
  137.         result[iNumFlag] = 0;               //构造减数  
  138.         for(i=0;i<iNumFlag+1;++i)  
  139.         {  
  140.             result[i] = (iMinuend[i]-result[i]);  
  141.         }  
  142.         //调整借位   
  143.         for(i=0;i<iNumFlag;++i)  
  144.         {  
  145.             if(result[i]<0)  
  146.             {  
  147.                 result[i+1] -= 1;  
  148.                 result[i] = 10+result[i];  
  149.             }  
  150.         }  
  151.         result[iMaxNum-1] = -1;  
  152.     }  
  153. }  
  154.   
  155. void PrintBigNum(int *result)  
  156. {  
  157.     int index = MAX_DIGIT*2-1;  
  158.     bool bNegative = false;  
  159.     //从最高位找到第一个不为负的位,从此位开始为有效值  
  160.     while(result[index]<=0)  
  161.     {  
  162.         if(result[index]<0)  
  163.         {  
  164.             bNegative = true;  
  165.         }  
  166.         index--;  
  167.     }  
  168.     if(bNegative)  
  169.     {  
  170.         printf("-");  
  171.     }  
  172.     for(int i=index;i>=0;--i)  
  173.     {  
  174.         printf("%d",result[i]);  
  175.     }  
  176.     printf("/n");  
  177. }  
  178.   
  179. void CArray2revDigitArray(char *cArray,int *DigitArray,unsigned int iNum)  
  180. {  
  181.     int i = 0;  
  182.     unsigned int iLen = strlen(cArray);  
  183.     //初始化DigitArray   
  184.     for(i=0; i<iNum; ++i)  
  185.     {  
  186.         DigitArray[i] = 0;  
  187.     }  
  188.     for(i=0; i<iLen; ++i)  
  189.     {  
  190.         DigitArray[iLen-1-i] = cArray[i]-'0';  
  191.     }  
  192. }  
  193.   
  194. int main()  
  195. {  
  196.     int a[MAX_DIGIT],b[MAX_DIGIT],resultArray[2*MAX_DIGIT];  
  197.     char cArray1[MAX_DIGIT],cArray2[MAX_DIGIT];  
  198.     int ret = 0;  
  199.     int *result = (int *)resultArray;  
  200.     printf("Input multiplier:/n");  
  201.     scanf("%s",cArray1);  
  202.     printf("Input multiplicand:/n");  
  203.     scanf("%s",cArray2);  
  204.     CArray2revDigitArray(cArray1,a,MAX_DIGIT);  
  205.     CArray2revDigitArray(cArray2,b,MAX_DIGIT);  
  206.     ret=Multiply(a,b,result);  
  207.     if(ret!=0)  
  208.     {  
  209.         printf("Multiply error,ret:%d/n",ret);  
  210.         return -1;  
  211.     }  
  212.     PrintBigNum(result);  
  213.   
  214.     ret=Add(a,b,result);  
  215.     if(ret!=0)  
  216.     {  
  217.         printf("Multiply error,ret:%d/n",ret);  
  218.         return -1;  
  219.     }  
  220.     PrintBigNum(result);  
  221.   
  222.     ret=Sub(a,b,result);  
  223.     if(ret!=0)  
  224.     {  
  225.         printf("Multiply error,ret:%d/n",ret);  
  226.         return -1;  
  227.     }  
  228.     PrintBigNum(result);  
  229.     return 0;  
  230. }  

 

原创粉丝点击