描述:
计算两个大整数的乘积。
输入:
输入有两行,第一行单独一个大整数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 }