精度计算——加法
语法:add(char a[],char b[],char s[]);
参数:
a[]:被加数,用字符串表示,位数不限
b[]:加数,用字符串表示,位数不限
s[]:结果,用字符串表示
返回值:null
注意:
-
空间复杂度为 o(n^2)
-
需要 string.h
源程序:
void add(char a[], char b[], char ans[])
{
int len = (strlen(a)>strlen(b)? strlen(a):strlen(b))+2;
char *c = new char[len]; //用来存结果
int k=0;
int up=0; //进位
int x,y,z;
for(int i=strlen(a)-1,j=strlen(b)-1; i>=0||j>=0; i--,j--)
{//2个索引分别指向字符串的最后一位,只要其中一个索引大于0,就向前遍历
x = i>=0 ? a[i]:'0';
y = j>=0 ? b[j]:'0';
z = x-'0'+y-'0'+up;
if(z>9) {up=1; z%=10;}
else up=0;
c[k++] = z+'0'; //还原成数字,妙啊!!
}
if(up) c[k++] = '1'; //如果最高位有进位
int cnt;
for(cnt=0; cnt<k; cnt++) //倒置字符串
ans[cnt] = c[k-cnt-1];
ans[cnt] = ' '; //加上结束符
}
自己的做法:(空间用多啦)
void add(char a[],char b[], char s[]){
int alen=strlen(a);
int blen=strlen(b);
char str1[100];
char str2[100];
char ans[100];
//注意这里是给每个字节初始化为整数0,,而不是字符'0'
//因为下面计算时字符串中存的值,其实都代表整数
memset(str1,0,sizeof(str1));
memset(str2,0,sizeof(str2));
for(int i=0; i<alen; i++){
str1[i]=a[alen-i-1]-'0'; //倒置并存上与0的差值
}
for(int i=0; i<blen; i++){
str2[i]=b[blen-i-1]-'0'; //倒置并存上与0的差值
}
int len = alen>blen ? alen : blen;
int c=0; //进位
for(int i=0; i<len; i++){
ans[i]=str1[i]+str2[i]+c;
c=ans[i]/10;
ans[i] %=10;
}
if(c>0){ //如果最高位还有进位
len++;
ans[len-1]=c;
}
for(int i=0; i<len; i++){ //再倒置,并还原为数字<0-9>
s[i]=ans[len-1-i]+'0';
}
s[len]=' '; //加上结束符
}