您的位置:首页 > 其它

大整数乘法问题

2013-04-11 11:15 169 查看
/*
大整数乘法问题:应用数组解决,由于计算机的精度是有限的,因此单纯使用程序设计语言提供的原子数据类型来
完成两个大整数的乘法显然是不切实际的。可以考虑用两个数组来分别存储一些大于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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: