大數加法,字符串處理。關鍵是細節,這方面的問題我老是把邊界下標搞錯,比如這次就是因為訪問到了數組的len元素而導致結果出錯。
關與加法的策略:
以前未解決兩個家數的對齊問題,我會先把兩個字符串倒序,相加、進位后再倒回來,感覺這樣到來倒去的實在麻煩。
現在頓悟了,果斷不再倒序,從字符串的高下標處開始相加兩個數,只要有數字的下標低于1(0位用來保存進位)就停止。具體做法是:
1.用c(指針)記錄較長的那個數字
2.預處理:把a、b數組內的字符轉化為數字
3.從a、b數組的高下標處(實際加數的低位)開始相加數字a、b
4.從數字的高下標處開始處理進位
5.完成處理:把數字轉化為字符
注意:消除和的前導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
小鼠標 閱讀(138)
評論(0) 編輯 收藏 引用 所屬分類:
大數