/*
大整数乘法问题:应用数组解决,由于计算机的精度是有限的,因此单纯使用程序设计语言提供的原子数据类型来
完成两个大整数的乘法显然是不切实际的。可以考虑用两个数组来分别存储一些大于10的整数,这些数字按顺序
排列在一起,分别表示一个大整数的每一位上的数字,于是大整数的储存问题就解决了。然后按照基本乘法规则
对这两个大整数进行运算即可。
*/
#include<iostream> //#include <memory> using namespace std; int* multi(int* num1,int size1,int* num2,int size2) { int size = size1 + size2; //两个数相乘后的位数会小于两个数的位数之和 int *ret=new int[size]; //动态申请一个数组用于存放相乘后的结果 int i=0; memset(ret,0,sizeof(int) * size); //将ret指向的数组空间赋值为0 for (i=0;i<size2;++i) { int k=i; for (int j=0;j<size1;++j) { ret[k++] += num2[i]*num1[j]; } } for (i=0;i<size;++i) { if (ret[i]>=10) //如果两个数中的两位相乘后之积大于10,将进位加上后面一位,将各位与本位相加 { ret[i+1]+=ret[i]/10; ret[i] %= 10; } } return ret; } int main() { int num1[]={1,2,3,4,5,6,7,8,9,1,1,1,1,1}; //第一个14位的大整数11111987654321 int num2[]={1,1,1,2,2,2,3,3,3,4,4,4,5,5}; //第二个14位的大整数55444333222111 int *ret=multi(num1,14,num2,14); for(int i =27;i>=0;i--) //两个14位的大整数相乘后结果位小于等于28位 { cout<<ret[i]; } delete[] ret; return 0; }