笔试中经常遇到,实现两个大数相乘(或相加)问题,现给出摘录的一个解答。

    【要求】本问题中,要求输入两个相对较大的正整数,能够通过程序计算出其结果。
    【提示】两个相对较大的数肯定是不能够用LONG INT类型存储的,因为LONG型数据的数据范围也并不是很大,于是就需要采用其他的存储结构。这里推荐用数组存储一个大数,数组的初始空间可以定义到如200或300个单元,每个单元存储一位数据,形如下图:
    2 5 5 9 6 2 0 7.。。。。
    这样理论上,比如数组定义为200,就可以存储200个数字的整数,应该是满足足够大的条件了。而结果的存储也需要考虑空间的问题,所以需要一个更大的数组。
    在解决了存储问题后,我们需要来实现乘法运送的过程,也就是说你必须要把这个数组中的每一位数字单独来进行乘法运算,比如我们可以用一个数字和另外一个数组中的每一位去相乘,从而得到乘法运算中一行的数字,再将每一行数字错位相加。这就是乘法运算的过程。

 

 
  
  1. //C程序实现:  
  2. //以下是com_def.h文件  
  3. #ifndef __COM_DEF_H_  
  4. #define __COM_DEF_H_  
  5.  
  6. #include <stdio.h>  
  7. #include <stdlib.h>  
  8. #include <math.h>  
  9. #include <string.h>  
  10. #include <conio.h>  
  11.  
  12. #define TRUE 1  
  13. #define FALSE 0  
  14. #define OK 1  
  15. #define ERROR 0  
  16.  
  17. typedef int Boolean;  
  18. typedef int Status;  
  19.  
  20. #endif  
  21.  
  22. //以下是mul.h文件  
  23. #ifndef __MUL_H_  
  24. #define __MUL_H_  
  25.  
  26. #include "com_def.h"  
  27. #define N 200  
  28.  
  29. extern void changes(); //将字符转移到数组  
  30. extern void mul(); //计算  
  31.  
  32. #endif  
  33.  
  34.  
  35. //以下是mul.c文件  
  36. #include "mul.h"  
  37.  
  38. void changes(int *a ,char *s)  
  39. {  
  40.     int i;  
  41.     char ch;  
  42.     int len = strlen (s);  
  43. //以下代码是对数组初始化  
  44.     for (i = 0 ;i < N;i ++)  
  45.     {  
  46.         *(a + i) = 0;  
  47.     }  
  48.     for (i = 0 ;i < len;i ++)  
  49.     {  
  50.         ch = *(s + i);  
  51.         *(a + len - 1 -i) = ch - '0';  
  52.     }  
  53. }  
  54.  
  55. void mul(int *a ,int *b ,int *c) //结果存入C  
  56. {  
  57.     int i,j;  
  58.     //以下代码初始化c  
  59.     for (i = 0 ;i < 2 * N;i ++)  
  60.     {  
  61.         *(c + i) = 0;  
  62.     }  
  63.     //二层循环逐位相乘  
  64.     for (i = 0 ;i < N;i ++)  
  65.     {  
  66.         for (j = 0 ;j < N;j ++)  
  67.         {  
  68.             *(c + i + j) += *(a + i) * *(b + j); //对应位累加  
  69.         }  
  70.     }  
  71.     for (i = 0 ;i < 2 * N;i ++) //移位  
  72.     {  
  73.         *(c + i +1) += *(c + i) / 10;  
  74.         *(c + i) = *(c + i) % 10;  
  75.     }  
  76. }  
  77.  
  78.  
  79. //以下是main函数所在文件  
  80. #include "mul.h"  
  81.  
  82. int main()  
  83. {  
  84.     int a[N],b[N],c[2 * N];  
  85.     char s1[N],s2[N];  
  86.     int i,j = 2 * N - 1;  
  87.  
  88.     printf("输入第一个数:");  
  89.     scanf("%s",s1);  
  90.     printf("\n");  
  91.     printf("输入第二个数");  
  92.     scanf("%s",s2);  
  93.     printf("\n");  
  94.  
  95.     changes(a,s1);  
  96.     changes(b,s2);  
  97.     mul(a,b,c);  
  98.     while(c[j] == 0)  
  99.     {  
  100.         j --;  
  101.     }  
  102.     for(i = j;i >= 0;i --)  
  103.     {  
  104.         printf("%d",c[i]);  
  105.     }  
  106.     printf("\n");  
  107.     return 0;  
  108. }  
  109.  
  110.