大數(shù)加法,字符串處理。關(guān)鍵是細(xì)節(jié),這方面的問題我老是把邊界下標(biāo)搞錯(cuò),比如這次就是因?yàn)樵L問到了數(shù)組的len元素而導(dǎo)致結(jié)果出錯(cuò)。
關(guān)與加法的策略:
以前未解決兩個(gè)家數(shù)的對(duì)齊問題,我會(huì)先把兩個(gè)字符串倒序,相加、進(jìn)位后再倒回來,感覺這樣到來倒去的實(shí)在麻煩。
現(xiàn)在頓悟了,果斷不再倒序,從字符串的高下標(biāo)處開始相加兩個(gè)數(shù),只要有數(shù)字的下標(biāo)低于1(0位用來保存進(jìn)位)就停止。具體做法是:
1.用c(指針)記錄較長(zhǎng)的那個(gè)數(shù)字
2.預(yù)處理:把a(bǔ)、b數(shù)組內(nèi)的字符轉(zhuǎn)化為數(shù)字
3.從a、b數(shù)組的高下標(biāo)處(實(shí)際加數(shù)的低位)開始相加數(shù)字a、b
4.從數(shù)字的高下標(biāo)處開始處理進(jìn)位
5.完成處理:把數(shù)字轉(zhuǎn)化為字符
注意:消除和的前導(dǎo)0


#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define LEN 110
#define MOD 20
int toNumber(char c)


{
if(c >= '0' && c <= '9')
return c - '0';
else if(c >= 'a' && c <= 'j')
return c - 'a' + 10;
}
int toChar(int n)


{
if(n >= 0 && n <= 9)
return n + '0';
else if(n >= 10 && n <= 19)
return n + 'a' - 10;
}
char *Add(char *a, char *b)


{
int i, j, k;
int lena, lenb, lenc;
char *c;
lena = strlen(a);
lenb = strlen(b);
if(lena > lenb)

{
lenc = lena;
c = a;
}
else

{
lenc = lenb;
c = b;
}
for(i = 0; i < lena; i++)
a[i] = toNumber(a[i]);
for(j = 0; j < lenb; j++)
b[j] = toNumber(b[j]);
for(i = lena - 1, j = lenb - 1, k = lenc - 1; i >= 0 && j >= 0; i--, j--, k--)

{
c[k] = a[i] + b[j];
}
int t, n;
t = 0;
for(i = lenc - 1; i >= 0; i--)

{
n = c[i] + t;
t = n / MOD;
c[i] = n % MOD;
}
for(i = 0; i <= lenc - 1; i++)
c[i] = toChar(c[i]);
return c;
}
int main()


{
int i, j;
char a[LEN], b[LEN];
char *c;
a[0] = b[0] = '0';
while(scanf("%s%s", &a[1], &b[1]) == 2)

{
c = Add(a, b);
if(c[0] == '0')

{
printf("%s\n", &c[1]);
}
else

{
printf("%s\n", c);
}
a[0] = b[0] = '0';
}
}
posted on 2012-05-11 19:05
小鼠標(biāo) 閱讀(137)
評(píng)論(0) 編輯 收藏 引用 所屬分類:
大數(shù)