大整数乘法问题

/*
大整数乘法问题:应用数组解决,由于计算机的精度是有限的,因此单纯使用程序设计语言提供的原子数据类型来
完成两个大整数的乘法显然是不切实际的。可以考虑用两个数组来分别存储一些大于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;
}                    

 

posted @ 2013-04-11 11:15  小菜美妞成长中  阅读(469)  评论(0编辑  收藏  举报