大数相加

//支持整形和浮点数,输入参数为以'/0'结尾的字符内存块首地址,返回指向某个内存块的指针

#include<iostream>
using namespace std;



char*intger_add(char*A,char*B);
char*float_add(char*A,char*B);


void main(){

 /*
 memset(a,1,12);
  memset(b,1,12);
  ;*/
 char bufa[250]; 
 char bufb[250];
 (cin.get(bufa,250)).get();
 char strA[]=bufa;
 cin.get(bufb,250);
 char strB[]=bufb;  
  cout<<float_add(strA,strB)<<endl; 
   
}
//************************************
// Method:    big_add
// FullName:  big_add
// Access:    public
// Returns:   char*    结果字符串的指针地址
// Qualifier:
// Parameter: char * A 以'/0'结尾数字字符串指针
// Parameter: char * B 以'/0'结尾数字字符串指针
//************************************
char*intger_add(char*A,char*B){
 int lenA=strlen(A);
 int lenB=strlen(B);
 char*src,*opt;
 
 (lenA>lenB)?(src=A,opt=B):(src=B,opt=A);
 int MaxLength=((lenA>lenB)?lenA:lenB)+2;
 char*rs=new char[MaxLength]; 
 rs[MaxLength-1]='/0';
 rs[0]='0';
 memccpy(rs+1,src,'/0',strlen(src));     //将较长字符串作为被操作数,并预留一位以备进位使用

 const int lPosS=MaxLength-2;            //被操作字符串个位数字位置
 const int lPosT=strlen(opt)-1;          //操作字符串个位数字位置
 int of=0,k=lPosS,temp;   
 for(int j=lPosT;j>=0&&k>=0;j--,k--){  
  temp=int(opt[j])+(int)rs[k]-2*int('0')+of; //temp=被操作数+操作数+进位
     if(temp>9)
  {
   rs[k]=temp-10+'0';
      of=1;
  }
  else{
   rs[k]=temp+'0';
   of=0;
  }
 }
 while(k>=0){
  temp=(int)rs[k]+of-(int)'0';
  if(temp>9){
      rs[k]=temp+'0'-10;
         of=1;
  }
  else{
  of=0;
  rs[k]=temp+'0';
  }
  k--;
 }
 return (rs[0]=='0')?(rs+1):rs;
}
char*float_add(char*A,char*B){
 char*AI="",*AF="",*BI="",*BF="";
 for(int i=0;i<strlen(A);i++)
 {
  if('.'==A[i])
   if(i==0)
    AF=A+1;
   else{
    AF=A+i+1;
          AI=A;
    A[i]='/0';
   }
 }
 for(int i=0;i<strlen(B);i++)
 {
  if('.'==B[i])
   if(i==0)
    BF=B+1;
   else{
    BF=B+i+1;
          BI=B;
    B[i]='/0';
   }

 }
 char*lp,*sp;
 (strlen(AF)>strlen(BF))?(lp=AF,sp=BF):(lp=BF,sp=AF);
 
 char*p=new char[strlen(lp)+1];
 p[strlen(lp)]='/0';
 memset(p,'0',strlen(lp));
 memccpy(p,sp,'/0',strlen(sp));
 char*part2=intger_add(p,lp);

    char off[2];
 if(strlen(part2)>strlen(p))
 {
  part2=part2+1; 
     off[0]='1';
     off[1]='/0';
 }
 else
 {
  off[0]=off[1]='/0';
 }
 char*temp=intger_add(AI,BI);
 char*part1=intger_add(temp,off);
 char*rs=new char[strlen(part1)+strlen(part2)+2];
 rs[strlen(part1)+strlen(part2)+1]='/0';
 memccpy(rs,part1,'/0',strlen(part1));
 rs[strlen(part1)]='.'; 
 memccpy(rs+strlen(part1)+1,part2,'/0',strlen(part2)); 
 delete[] p;
 p=NULL;
 return rs;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值