二十进制数的加法

题目详情:

在二十进制中,我们除了使用数字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));
    }
}

转载于:https://www.cnblogs.com/JonnyZhou/p/3512995.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值