大整数相乘算法

#include <iostream.h>
#include <malloc.h>
#include <iomanip.h>
#include <string.h>
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>

struct Larger
{
 int length;
 int flag;//+ -
 char data[200];
};
///input/
void getdata(Larger& d1,Larger& d2);
void printdata(Larger d);
void adddata(Larger& d1,Larger& d2,Larger& d);
void reversedata(Larger& d);
void minusLdata(Larger& d1,Larger& d2,Larger& d);
void dividedata(Larger d,Larger &left,Larger &right);
void multidata(Larger d1,Larger d2,Larger& d);
void powerdata(Larger& d,int length);

int main()
{
 Larger data1,data2;
 Larger Sum,Minus,Div1,Div2,Multi;
 getdata(data1,data2);
 printdata(data1);cout<<endl;
 printdata(data2);cout<<endl;
 adddata(data1,data2,Sum);
 minusLdata(data1,data2,Minus);
 multidata(data1,data2,Multi);
 return 0;
}

void getdata(Larger& d1,Larger& d2)
{
 int i=0;
 cout<<"Input the first data:"<<endl;
 cin>>d1.data;
 d1.length=strlen(d1.data);
 d1.flag=0;
 cout<<"Input the second data:"<<endl;
 cin>>d2.data;
 d2.length=strlen(d2.data );
 d2.flag=0;
 reversedata(d1);
 reversedata(d2);
}
void reversedata(Larger& d)
{
 int i=0;
 char swap;
 for(i=0;i<d.length-i;i++)
 {
  swap=d.data[i];
  d.data[i]=d.data[d.length-i-1];
  d.data[d.length-i-1]=swap;
 }
 for(i=0;i<d.length;i++)d.data[i]=d.data[i]-'0';
}

void printdata(Larger d)
{
 int i=0; 
 i=d.length-1;
 if(i==0)
 {
  if(d.flag==1)printf("-");
  printf("%d",d.data[i]);
 }
 else
 {
  if(d.flag==1)printf("-");
  while(d.data[i]==0)i--;
  for(;i>=0;i--)
  {  
   printf("%d",d.data[i]);
  }
 }
}
void adddata(Larger& d1,Larger& d2,Larger& d)
{
 int carry=0;
 int i=0;
 if(d1.flag+d2.flag==1)
 {
  if(d2.flag==1)
  {
   d2.flag=0;
   minusLdata(d1,d2,d);
   d2.flag=1;
  } 
  else if(d1.flag==1)
  {
   d1.flag=0;
   minusLdata(d2,d1,d);
   d1.flag=1;
  }
 } 
 else
 {
  d.flag=d1.flag;
  if(d1.length>=d2.length)
  {
   d.length=d1.length;
   for(i=d2.length;i<d1.length;i++)d2.data[i]=0;
  }
  if(d2.length>d1.length)
  {
   d.length=d2.length;
   for(i=d1.length;i<d2.length;i++)d1.data[i]=0;
  }
  for(i=0;i<d.length;i++)
  {
   d.data[i]=d1.data[i]+d2.data[i]+carry;
   if(d.data[i]>9){d.data[i]=d.data[i]-10;carry=1;}
   else carry=0;
  }
  if(carry==1)
  {
   d.length=d.length+1;
   d.data[d.length-1]=1;
  }
 } 
 printdata(d1);
 printf("+");
 printdata(d2);
 printf("=");
 printdata(d);
 printf("/n");
}

void minusLdata(Larger& d1,Larger& d2,Larger& d)
{
 int flag1,flag2;
 int len1,len2;
 int i=0;
 int j=0;
 int bring=0,carry=0;
 Larger dd;
 flag1=d1.flag;flag2=d2.flag;
 d.flag=flag1;
 d.length=0;
 if(d1.flag+d2.flag==1)
 {
  len1=(d1.length>d2.length)?d1.length:d2.length;
  if(d2.flag==1)
  {
   d2.flag=0;
   adddata(d1,d2,d);
   d2.flag=1;
  } 
  else if(d1.flag==1)
  {
   d1.flag=0;
   adddata(d2,d1,d);
   d1.flag=1;
  }
 } 
 else
 {
  len1=d1.length;
  len2=d2.length;
  if(len1<len2)
  {
   for(i=len1;i<len2;i++){d1.data[i]=0;}
   len1=len2;
  }
  if(len2<len1)
  {
   for(i=len2;i<len1;i++){d2.data[i]=0;}
  }
  carry=0;
  bring=0;
  d.flag=d1.flag;
  for(i=0;i<len1;i++)
  {
   d.data[i]=d1.data[i]-d2.data[i]-carry;
   dd.data[i]=d2.data[i]-d1.data[i]-bring;
   if(d.data[i]<0){carry=1;d.data[i]=d.data[i]+10;}
   else carry=0;
   if(dd.data[i]<0){bring=1;dd.data[i]=dd.data[i]+10;}
   else bring=0;
  }
  if(carry==1){d=dd;d.flag=1-d1.flag;}
 }
 if(d.data[len1-1]==0)
 {
  i=1;
  while(d.data[len1-i]=0&&i<len1-1&&i!=1)i++;
  d.length=len1-i;
  if(d.length==0)d.length=1;
 }
 else d.length=len1;
 printdata(d1);
 printf("-");
 printdata(d2);
 printf("=");
 printdata(d);
 printf("/n");
}

void dividedata(Larger d,Larger &left,Larger &right)
{
 int halflen=0;
 int i=0;
 halflen=d.length/2;
 for(i=0;i<halflen;i++)right.data[i]=d.data[i];
 for(;i<d.length;i++)left.data[i-halflen]=d.data[i];
 left.length=d.length-halflen;
 right.length=halflen;
 printdata(left);
 printf("/n");
 left.flag=d.flag;
 right.flag=d.flag;
}

void powerdata(Larger& d,int length)
{
 int i=0;
 for(i=d.length-1;i>=0;i--)d.data[i+length]=d.data[i];
 for(i=length-1;i>=0;i--)d.data[i]=0;
 d.length=d.length+length;
 printdata(d);
 printf("/n");
}

void multidata(Larger d1,Larger d2,Larger& d)
{
 int carry=0;
 int i=0;
 Larger temp;
 Larger left1,left2,right1,right2;
 Larger m1,m2,m3,minus1,minus2,sum,sum2;
 m3=NULL;

 d.flag=0;
 if(d1.flag!=d2.flag)d.flag=1;
 if(d1.length==1||d2.length==1)
 {
  d.length=(d1.length>d2.length)?d1.length:d2.length;
  if(d2.length==1){temp=d2;d2=d1;d1=temp;}
  if(d1.length==1)
  {
   for(i=0;i<d.length;i++)
   {
    d.data[i]=d1.data[0]*d2.data[i]+carry;
    carry=d.data[i]/10;
    if(carry>0)d.data[i]=d.data[i]%10;
   }
   if(carry>0)
   {
    d.data[d.length]=carry;
    d.length=d.length+1;
   }
  }
 }
 else
 {
  if(d1.length>d2.length) {for(i=d2.length;i<d1.length;i++)d2.data[i]=0;d2.length=d1.length;}
  else {for(i=d1.length;i<d2.length;i++)d1.data[i]=0;d1.length=d2.length;}
  划分数据
  dividedata(d1,left1,right1);
  划分数据
  dividedata(d2,left2,right2);
  高位相乘
  multidata(left1,left2,m1);
  低位相乘
  multidata(right1,right2,m2);
  得到中间计算结果
  minusLdata(right1,left1,minus1);
  minusLdata(left2,right2,minus2);
  /计算中间乘积
  multidata(minus1,minus2,sum);
  adddata(sum,m1,sum2);
  adddata(sum2,m2,sum);
  powerdata(m1,right1.length*2);
  powerdata(sum,right1.length);
  adddata(m1,sum,sum2);
  adddata(sum2,m2,d);
 }
 printdata(d1);
 printf("*");
 printdata(d2);
 printf("=");
 printdata(d);
 printf("/n");
}

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值