分治算法-大整数乘法

用分治算法编程实现两个n位十进制大整数的乘法运算。

分析

用分治算法编程实现两个n位十进制大整数的乘法运算。

算法描述

两个十进制的数 X ,Y;

X=    A*10^n1 +B

Y= C*10^n2 +D                 

则 X*Y=(A*10^n1+B)*(C*10^n2+D)

设一个数组,将其看做10000进制,然后按照乘法运算,如果设大于10000的进制,则两数相乘很有可能超过int的数据范围所以设10000进制)

#include<iostream>
#include<string>
#include<math.h>
using namespace std;
char c1[100];
char c2[100];
int num1[200];
int num2[100];
int result[205];
int l1,l2;
//将字符串转化为10000进制的数字
int change(int l,int num[],char c[])
{
 int k,i,j,r;
 r=l%4;
 k=0;
 for(i=l-1;i>=r;i-=4){
  for(j=i;j>i-4;j–){
   int d=c[j]-‘0’;
   num[k]+=pow(10,(i-j))*d;
  }
  k++;
 }
 if(r!=0)
  for(i=r-1;i>=0;i–)
   num[k]+=pow(10,(r-1-i))*(c[i]-‘0’);
 k++;
 return k;
}
//打印
void print(int l){
 int k=0,i;
 int flag=0;
 for(i=200-1;i>=0;i–){
  if(result[i]!=0&&!flag){
   cout<<result[i];
   flag=1;
  }
  else{
   if(flag){
    if(result[i]/1000!=0)
     cout<<result[i];
    else if(result[i]/100!=0)
     cout<<“0″<<result[i];
    else if(result[i]/10)
     cout<<“00″<<result[i];
    else if(result[i]!=0)
     cout<<“000″<<result[i];
    else cout<<“0000”;
   }
  }
 }
}
//乘法
void fun(){
 int i,j,c;
 c=0;
 for(i=0;i<l2;i++){
  c=0;
  for(j=0;j<15;j++){
   result[j+i]+=num1[j]*num2[i]+c;
   c=result[j+i]/10000;
   result[j+i]%=10000;
  }
 }
 print(l1);
}
int main()
{
 cin>>c1>>c2;
 memset(num1,0,sizeof(num1));
 memset(num2,0,sizeof(num2));
 memset(result,0,sizeof(result));
 l1=strlen(c1);
 l2=strlen(c2);
 l1=change(l1,num1,c1);
 l2=change(l2,num2,c2);
 fun();
 return 0;
}

    原文作者:大整数乘法问题
    原文地址: https://blog.csdn.net/chaojiaini/article/details/6897733
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞