华为给定函数接口void BigNumAdd(const char *ca[],const char *cb[],int *ians[]);要求实现大数相加功能。
个人猜测:
- 数据的存储情况是两维数组(字符型),ca[i]表示的是某行,这是一个地址,指向一个char(字符),例如数字123,存储时是第一行1,即ca[1]=1;第二行2,即ca[2]=2;第三行3,即ca[3]=3;
- ca[i]用NULL初始化,这用来做ca是否结束的判断;
- ca开辟的是alen空间,cb开辟的是blen空间,ians开辟maxnum空间;
思路见:http://www.cnblogs.com/caixu/archive/2011/09/26/2192189.html
-----------------------
贴代码:
#include <iostream>
using namespace std;
const int maxnum=20;
void BigNumAdd(const char *ca[],const char *cb[],int *ians[])
{
int *ia,*ib;
int i=0,itemp=0;
ia=new int[maxnum];
ib=new int[maxnum];
for (i=0;i<maxnum;i++)//ia和ib数组初始化,置0
{
ia[i]=0;
ib[i]=0;
}
int alen=0,blen=0;
i=0;
while (ca[i])//以NULL来区分是否ca结束,ca长度存alen
i++;
alen=i;
for (i=0;i<alen;i++)//a从字符串转数组
{
ia[i]=ca[alen-1-i][0]-'0';//高低位倒置
}
i=0;
while (cb[i])i++;
blen=i;
for (i=0;i<blen;i++)
{
ib[i]=cb[blen-1-i][0]-'0';
}
int maxlen=0;
maxlen=(alen>blen)?alen:blen;
for (i=0;i<maxlen;i++)//求和
{
*ians[maxlen-i]=ia[i]+ib[i]+*ians[maxlen-i];//高低位逆转回来
if (*ians[maxlen-i]>9)
{
*ians[maxlen-i]=*ians[maxlen-i]-10;
*ians[maxlen-i-1]=*ians[maxlen-i-1]+1;
}
}
cout<<"=";
if (!ians[0])cout<<ians[0];
for (i=1;i<maxlen+1;i++)
{
cout<<*ians[i];
}
cout<<endl;
delete ia;
delete ib;
}
void main()
{
//输入示例:1+2
//输出结果:=3
const char *ca[maxnum];const char* cb[maxnum];
int *ians[maxnum+1];
int i=0;
int alen=0,blen=0;
char* p=NULL;
for (i=0;i<maxnum;i++)ca[i]=NULL;//假设ca和cb是这样初始化的
for (i=0;i<maxnum;i++)cb[i]=NULL;
i=0;
while (1)//接收输入a,“+”前面的是加数a
{
p=new char;
*p=getchar();
if (*p=='+'){delete p;i++;break;}
ca[i]=p;
i++;
}
alen=i-1;
i=0;
while (1)//接收输入b,“+”后、Enter键前的是被加数b
{
p=new char;
*p=getchar();
if (*p==10){delete p;i++;break;}
cb[i]=p;
i++;
}
blen=i-1;
for (i=0;i<maxnum+1;i++)
{
ians[i]=new int;
*ians[i]=0;
}
BigNumAdd(ca,cb,ians);
for (i=0;i<alen;i++)
delete ca[i];//注销的ca长度是alen,不是maxnum
for (i=0;i<blen;i++)
delete cb[i];
for (i=0;i<maxnum+1;i++)
delete ians[i];
}