高精度乘法_利用二维矩阵

#include <iostream>
#include <string>
#define MaxCharBufferSize 100
#define MaxIntBufferSize 50
#define CharPerInteger 4
#define CoverPerInteger 100000000


using namespace std;

/*void reversethearray(char* intarray,int lengthofarray){


char *arrayb=new char(lengthofarray);
for (int i=0;i<lengthofarray;i++)
{
arrayb[i]=intarray[i];
}
for (int i=0;i<lengthofarray;i++)
{
intarray[lengthofarray-i-1]=arrayb[i];
}
}
*/
int tens(int pow){
 int result=1;
 if(pow==0)
  return result;
 for (int i=0;i<pow;i++)
 {
  result=result*10;
 }
 return result;
}
int StringtoInteger(char* stringa,int* inta){
 int length=strlen(stringa);
 int count_size=length/CharPerInteger;
 if (length%CharPerInteger!=0)
 {
  count_size++;
 }
 for (int i=0;i<count_size;i++)
 {
  int buffer=0;

  for (int j=0;j<CharPerInteger&&(i*CharPerInteger+j)<length;j++)
  {
   buffer=buffer+(stringa[length-i*CharPerInteger-j-1]-'0')*tens(j);
   // cout<<buffer<<'/t';
  }
  inta[i]=buffer;
 }
 return count_size;
}

void Printthearray(int* inta,int length_string){
 for (int i=0;i<length_string;i++)
 {
  cout<<inta[i]<<'/t';
 }
 cout<<length_string<<endl;
}

int IntegerAnd(int* integera,int lengthofa,int* integerb,int lengthofb){
 bool flags[MaxIntBufferSize]={false};
 int length=lengthofa;
 if (lengthofa<lengthofb)
 {
  length=lengthofb;
  for(int i=lengthofa;i<length;i++)
   integera[i]=0;
 }
 else
  for (int i=lengthofb;i<length;i++)
  {
   integerb[i]=0;
  }
  cout<<"length="<<length<<endl;

  for (int i=0;i<length;i++)
  {
   int sum=integera[i]+integerb[i];
   if (sum>=CoverPerInteger)
   {
    flags[i]=true;

   }
   cout<<"flags("<<i<<")="<<flags[i]<<'/t';
   integera[i]=sum;
   cout<<integera[i]<<'/t';

  }

  cout<<endl;

  for (int i=0;i<length;i++)
  {
   if (flags[i]==true)
   {
    integera[i]=integera[i]-CoverPerInteger;
    integera[i+1]++;
    if (integera[i+1]>=CoverPerInteger)
    {
     flags[i+1]=true;
    }
   }
   if (flags[length-1]==true)
   {
    integera[length]=1;
    length++;
   }
  }
  cout<<"True length is:"<<length<<endl;

  return length;

}
int IntegerMulti(int* intarray1,int length1,int* intarray2,int length2,int* resultarray){
 int length=length1+length2;
 for (int i=0;i<length;i++)
 {
  resultarray[i]=0;
 }
 for (int i=0;i<length1;i++)
 {
  for (int j=0;j<length2;j++)
  {
   resultarray[i+j]+=intarray1[i]*intarray2[j];
   //cout<<i+j<<':'<<resultarray[i+j]<<'/t';
  }
 }
// cout<<endl;
 Printthearray(resultarray,length);
 for (int i=0;i<length-1;i++)
 {
  int Mask=10000;
  resultarray[i+1]+=resultarray[i]/Mask;
  resultarray[i]=resultarray[i]%Mask;
 }
 while (resultarray[length-1]==0&&length>1)
 {
  length--;
 }
 return length;

}


void printtheresult( int* integer, int length )
{
 cout << "Last Result=" << endl;
 cout<<integer[length-1];
 for (int i=length-2;i>=0;i--)
 {
  int temp=integer[i];
  int Mask=1000;
  while(temp<Mask&&Mask>1)
  {
   cout<<'0';
   Mask/=10;
  }
  cout<<temp;
 }
}


void main(){
 char string1[MaxCharBufferSize];
 char string2[MaxCharBufferSize];
 int integer1[MaxIntBufferSize];
 int integer2[MaxIntBufferSize];
 int result[MaxIntBufferSize];

 //cout<<sizeof(int)<<endl;

 cout<<"Enter the first number:";
 cin>>string1;
 cout<<"Enter the second number:";
 cin>>string2;

 // reversethearray(string1,strlen(string1));
 // reversethearray(string2,strlen(string2));
 int length1=StringtoInteger(string1,integer1);
 int length2=StringtoInteger(string2,integer2);


 Printthearray(integer1,length1);
 Printthearray(integer2,length2);

 

// int length=IntegerAnd(integer1,length1,integer2,length2);

 int length=IntegerMulti(integer1,length1,integer2,length2,result);

// Printthearray(integer1,length);
 Printthearray(result,length);

 printtheresult(result,length);

 // printtheresult(integer1,length);

 for (;;)
 {
 }


}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值