大数乘法

描述:

 

计算两个大整数的乘积。

输入:

 

输入有两行,第一行单独一个大整数A,第二行单独一个大整数B。每个数的长度不超过1000。

输出:

 

单独一行输出A,B的精确乘积。结果请注意换行。

输入样例:

 

31415926535897932384626433
27182818284590452353602874

输出样例:

 

853973422267356706546355041900841480479296125168442

 

代码如下:

 1 #include<iostream>
 2 using namespace std;
 3 
 4 char a[1000];    //用字符串输入。比long long好 
 5 char b[1000];
 6 int mult[1000];        //计算结果用整型存储 
 7 int numa[1000];        //将乘数字符串a转换为int型的numa 
 8 int numb[1000];        //同上 被乘数char转int 
 9 int la = 0;            //数组a的长度 
10 int lb = 0;
11 
12 int main()
13 {
14     int i, j;
15     
16     //输入大数a, b; 
17     cin >> a;
18     cin >> b;
19     
20     //计算a,b的长度,为将a, b从char型转为int型做准备
21     i = 0;    //i初始化
22     while(a[i] != '\0')        //当字符串a从第一位开始到最后一位\0为止,计算长度la 
23     {
24         la++;
25         i++;
26     } 
27     i = 0;
28     while (b[i] != '\0')    //同理,计算长度lb 
29     {
30         lb++;
31         i++;
32     }
33     
34     //倒叙输入到数组numa、 numb中
35     for(i=0; i<la; i++)
36     {
37         numa[i] = a[la - i -1] - '0';        //同时-'0'将char转int 
38     }
39     for(i=0; i<lb; i++)
40     {
41         numb[i] = b[lb - i - 1] - '0';
42     } 
43     
44 //    测试numa、numb是否倒叙 
45 //    for(i=0; i<la; i++)
46 //    {
47 //        cout << numa[i];
48 //    }
49 //    for(i=0; i<lb; i++)
50 //    {
51 //        cout << numb[i];
52 //    }
53 
54     //开始计算
55     for(i=0; i<la; i++)
56     {
57         for(j=0; j<lb; j++)
58         {
59             mult[i+j] += numa[i] * numb[j];        //例如123 * 345 得到5 10 15/4 8 12/ 3 6 9 移位相加  
60         }
61     }
62     
63     //考虑进位
64     for(i=0; i<la+lb-2; i++)
65     {
66         if(mult[i] > 10)
67         {
68             mult[i+1] += mult[i] / 10;        //进位加到前一位置上 
69             mult[i] = mult[i] % 10;            //原位置取余数 
70         }
71     } 
72     
73     //由于是倒序,故再次倒序输出
74     for(i=0; i<la+lb-1; i++)
75     {
76         cout << mult[la + lb - i -2];
77     } 
78     cout << endl;
79     return 0;
80 } 

 

posted @ 2018-07-10 21:04  jtclm  阅读(1172)  评论(0编辑  收藏  举报