二十进制数的加法

题目详情:

在二十进制中,我们除了使用数字0-9以外,还使用字母a-j(表示10-19),给定两个二十进制整数,求它们的和。

输入是两个二十进制整数,且都大于0,不超过100位;

输出是它们的和(二十进制),且不包含首0。我们用字符串来表示二十进制整数。

 

思路梳理:

做题不想作文,作文可以有*的空间,而做题逻辑上永远是严谨的,而我们的大脑往往不能记住所以细节,所以就必须先构架好蓝图,依图行事,

1.设两个字符串为A,B,那我就要找出二者间长度最长的一个,设其长度为length

我要定义一个长度为length+1的数组ans来存放答案,为什么要+1呢,因为会有一种情况,如j+1,答案是10,也就是有进位,这个length+1的位就是专门为这位进位爷准备的

2.把a里面的内容存入ans。

3.把b中的内容加到ans上

这里就有一个误区了,天然的思维是这样,5位的a加1位的b,那么就只需要对1位的b中的每一位做一次加。

那么像这个例子:jjj+1就会得jj0.

所以说,a位加b位的字符串,应该加其中相对长度较长的那个的长度,当然,如果进位位为0时,也可以终止。

 

Source Code:

二十进制数的加法
#include<stdio.h>
#include<string.h>
#include<ctype.h>

char ans[100];
char* calculate(char *a,char *b){
    int lengtha = strlen(a);
    int lengthb = strlen(b);
    int lengthans = (lengtha > lengthb ? (lengtha+1) : (lengthb+1));
    int i,j,k = lengtha;
    char tmp,ci = 0;
    for(i = lengtha; i < lengthans; i++) ans[i-k] = 0;
    for(i = 0; i < lengtha; i++)
    {
        if(a[i] >= 48 && a[i]<=57) 
            ans[i+(lengthans - lengtha)] = (a[i] - 0);
        else                
            ans[i+(lengthans - lengtha)] = (a[i] - a + 10);
    }
    j = lengthans - lengthb;
    while(lengthb > 0)
    {
        tmp = b[lengthb-1];
        if(b[lengthb-1] >= 48 && b[lengthb-1]<=57) 
            tmp = tmp - 0;
        else 
            tmp -= (a - 10);
            
        if((tmp + ci + ans[lengthb+j-1]) >= 20)
        {
            ans[lengthb+j-1] += (tmp+ci-20);
            ci = 1;
        }
        else 
        {
            ans[lengthb+j-1] += (tmp+ci);
            ci = 0;
        }
        lengthb--;
    }
    while(ci > 0)//这里就是步骤3中那个常见的误区
    {
        ans[lengthb + j - 1] += ci;
        if(ans[lengthb + j - 1] < 20)
            break;
            
        ans[lengthb + j - 1] -= 20;
        ci = 1;
        lengthb--;
    }
    for(i = 0; i < lengthans; i++)
        if(ans[i] >= 0 && ans[i]<=9) 
            ans[i] += 0;
        else 
            ans[i] += (a-10);
    
    if (ans[0] != 0) //这样的返回字符串的形式还是头一次见
        return ans;
    else 
        return &ans[1];
}

int main(){
    char a[102];
    char b[102];
    while(scanf("%s %s",a,b) != EOF){
        printf("Ans = %s\n",calculate(a,b));
    }
}
二十进制数的加法

二十进制数的加法

上一篇:123123


下一篇:centos-64整合nginx和tomcat