大数加法,字符串处理。关键是细节,这方面的问题我老是把边界下标搞错,比如这次就是因为访问到了数组的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
小鼠标 阅读(132)
评论(0) 编辑 收藏 引用 所属分类:
大数