大数相加就是从个位开始一位位往前加.
大数相乘就是把其中一个大数一位位和另一个数相乘累加.
根据这个思想,编程实现
#include<cstdlib>
#include<iostream>
#include<cstring>
using namespace std;
bool islegaldata(const char *strdata)
//判断该数字字符串数组是否有非数字字符,若有则返回false
{
while(*strdata)
{
if(!isdigit(*strdata))
return false;
++strdata;
}
return true;
}
char *removprezero(char *strdata)
//移去字符串前端的字符‘0’
{
while(*strdata=='0')
++strdata;
return strdata;
}
char getdatafromstr(char *strdata,int index)
//取字符串中下标为index的字符
{
if(index<0)
return '0';
else
return strdata[index];
}
int addbigdatasub(char cx,char cy,int carry,char *sum)
//实现二个字符数字相加
{
int n=cx-'0'+cy-'0'+carry,ret=0;
if(n<10)
*sum=n+'0';
else
{
*sum=n-10+'0';
ret=1;
}
return ret;
}
char *addbigdata(char *stra,char *strb)
//实现二个大数相加,返回二者和的字符串
{
if(!islegaldata(stra)||!islegaldata(strb))
return NULL;
removprezero(stra);
removprezero(strb);
int lena=strlen(stra),lenb=strlen(strb),lenc;
lenc=(lena>lenb)?(lena+2):(lenb+2);
char *strc=new char[lenc];
memset(strc,'0',sizeof(char)*lenc);
strc[lenc-1]='\0';
int i,j,k;
i=(lena>lenb)?lena:lenb;
i-=1;
j=0;
k=lenc-2;
while(i-->=0)
j=addbigdatasub(getdatafromstr(stra,--lena),getdatafromstr(strb,--lenb),j,&strc[k--]);
if(j==1)
strc[k]='1';
else
strc=removprezero(strc);
return strc;
}
/////////////// 大数相乘 /////////////////////////
int multitwocha(char cx,char cy,int carry,char *sum)
//实现二个字符数字相乘
{
int n=(cx-'0')*(cy-'0')+carry,ret=0;
if(n<10)
*sum=n+'0';
else
{
*sum=n+'0';
ret=n/10;
}
return ret;
}
char *mulbigdatasub(char *str,char cx,int n)
//实现一个字符串与一个字符数字相乘
{
if(cx=='0')
return NULL;
int len=strlen(str),nmul=len+2+n,j=0;
char *mul=new char[nmul];
memset(mul,'0',nmul*sizeof(char));
mul[nmul-1]='\0';
len-=1;
int k=nmul-2-n;
for(;len>=0;--len)
j=multitwocha(str[len],cx,j,&mul[k--]);
if(j!=0)
mul[k]=j+'0';
return mul;
}
char *mulbigdata(char *stra,char *strb)
//实现二个字符串相乘,返回二者的乘积
{
if(!islegaldata(stra)||!islegaldata(strb))
return NULL;
removprezero(stra);
removprezero(strb);
int lena=strlen(stra),lenb=strlen(strb),lenc=lena+lenb+1;
char *strc=new char[lenc];
memset(strc,'0',lenc);
strc[lenc-1]='\0';
char *pstr,*q,*qbegin;
if(lena<lenb)
{
pstr=strb;
q=stra+lena-1;
qbegin=stra;
}
else
{
pstr=stra;
q=strb+lenb-1;
qbegin=strb;
}
int i=0;
char *mul=NULL;
while(q>=qbegin)
{
mul=mulbigdatasub(pstr,*q--,i++);
if(mul)
{
strc=addbigdata(strc,mul);
delete []mul;
}
}
strc=removprezero(strc);
return strc;
}
int main()
{
char *stra="93414",*strb="00935",*strc=NULL;
strc=addbigdata(stra,strb);
if(strc)
cout<<endl<<stra<<'+'<<strb<<'='<<strc<<endl;
char *s1="1234",*s2="942",*s3=NULL;
s3=mulbigdata(s1,s2);
if(s3)
cout<<endl<<s1<<'*'<<s2<<'='<<s3<<endl;
cout<<endl;
return 0;
}