大整数相乘

 1 //只适用于整数,有小数点的数字不适用,不过可以稍微处理后直接复用该函数
2 const int MaxNumberLen = 512;
3 void MultiofLargeNumber(long long number1,
4 long long number2,
5 int result[],
6 int& resultLen)
7 {
8 char chNumber1[MaxNumberLen];
9 char chNumber2[MaxNumberLen];
10
11 memset(chNumber1,0,MaxNumberLen * sizeof(char));
12 memset(chNumber2,0,MaxNumberLen * sizeof(char));
13
14 //转换成字符串
15 Number2String(number1,chNumber1);
16 Number2String(number2,chNumber2);
17
18 //由于传递进来的是数字,所以直接使用strlen就可以取得原数字的宽度
19 int number1Len = strlen(chNumber1);
20 int number2Len = strlen(chNumber2);
21
22 //从低位到高位依次计算,此处不对进位进行处理
23 for(int iN1 = number1Len - 1;iN1 >= 0;iN1 --)
24 {
25 for(int iN2 = number2Len -1 ;iN2 >= 0;iN2 --)
26 {
27 //由于数组中存储是的真实的字符'8',所以要对其计算与'0'的偏移
28 //从而得到该字符所表示的数字的值
29 //另外注意此处的结果需要是累加
30 result[iN1 + iN2] += (chNumber1[iN1] - '0') *
31 (chNumber2[iN2] - '0');
32 }
33 }
34
35 //这个长度,其实就是结果的占有的数组的位数,并非结果的实际宽度
36 //因为result[0]我们就不需要再保证其值要小于10了
37 resultLen = number1Len + number2Len - 1;
38
39 for(int i = resultLen;i>0;i--)
40 {
41 int iTemp = result[i];
42 if(iTemp >= 10){
43 result[i] = iTemp % 10;
44 result[i - 1] += iTemp / 10;
45 }
46 }
47 }

 

其基本思想是:

1:输入采取long long数据类型,这应该是当前平台可以支持的最大数据了

2:负数不考虑在内,因为负数可转换为正数调用该函数进行运算,然后再添加一个符号位即可

3:首先将正整数转换成字符串存储到一个数组中

4:其次从两个字符串的尾部依次做乘法,并将结果保存到结果数组的i+j位,其间要注意做乘法时要转换为真实的数字,即9=‘9 - ’0‘

5,最后结结果集进行进位计算,注意最高位不需要进行进位,即result[0]是多少,我们也不需要再管它,直接打印出它再连接上后面的每一位数字即可。

posted @ 2012-02-22 11:22  Marstar  阅读(960)  评论(0编辑  收藏  举报