zoj1205Martian Addition大数加法

zoj1205Martian Addition大数加法

大数加法,字符串处理。关键是细节,这方面的问题我老是把边界下标搞错,比如这次就是因为访问到了数组的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';
    }

}


 

你可能感兴趣的:(zoj1205Martian Addition大数加法)