107 16进制加法

问题描述 :

某天、小晨在路上背着单词,突遇一外星人,外星人对小晨很感兴趣,为了考验小晨的智商,就向小晨提问简单加法,由于外星人使用16进制,所以,小晨必须用16进制回答。

 

输入说明 :

首先输入一个整数T,

以下T行,每行两个16进制数字

输出说明 :

T行,每行一个16进制数,为求出的两数之和。

其中的英文字母a到f为小写。

输入范例 :

2
4b0d 4887
2745 7438

输出范例 :

9394
9b7d

思想:和上题一样,改一下进位判断条件和处理a-f和0-9的asc码的方法即可。

#include <stdio.h>
#include <string.h>

int main()
{
    int num, i, j, k;
    scanf("%d", &num);
    for (k = 0; k < num; k++)
    {
        char n[4000];
        char num1[2000];
        int count1 = 0;
        char num2[2000];
        int count2 = 0;
        char res[3000];
        int count3 = 0;
        if(k==0){
            getchar();      //首行输入 吸收一下回车
        }
        gets(n);
        int flag = 0;  //进位标志
        for (i = 0; i < strlen(n); i++) //第一个数字
        {
            if (n[i] != ' ')
            {
                num1[count1++] = n[i];
            }
            else
            {
                i++;
                break;
            }
        }
        for (; i < strlen(n); i++)  //第二个数字
        {
            if(n[i]==' '){  // oj给的最后一个算例 调了一个小时没找到问题在哪 原来是它输入不规范 第二个数后面有空格 给它特殊处理一下 
                break;
            }
            num2[count2++] = n[i];
            if(n[i]==' '){
                break;
            }
        }
        count1--;  //count指向了后一个数 所以还原一下
        count2--;
        while (count1>=0 && count2>=0)  //进行加法
        {
            int a ,b;
            if(num1[count1]>='a'&&num1[count1]<='f'){
                a = num1[count1] - 87;
                count1--;
            }else{
                a = num1[count1] - '0';
                count1--;
            }
            if(num2[count2]>='a'&&num2[count2]<='f'){
                b = num2[count2] - 87;
                count2--;
            }else{
                b = num2[count2] - '0';
                count2--;
            }
            int temp = a + b  + flag;
            flag = 0;
            if (temp >= 16)  
            {
                flag = temp/16;
                temp %= 16;
            }
            if(temp>=10&&temp<16){
                temp = temp+87;
            }else{
                temp = temp+'0';
            }
            res[count3++] = temp;
        }
        if (count1==-1 && count2==-1 && flag)  //如果两个数都加完了,还往前进一位的情况
        {
            res[count3++] = flag+'0';
        }
        else
        {
            while (count1>=0)  //1数的高位 累加进位处理
            {
                int temp;
                if(num1[count1]>='a'&&num1[count1]<='f'){
                   temp = num1[count1--] - 87 + flag;
                }else{
                   temp = num1[count1--] - '0' + flag;
                }
                flag = 0;
                if (temp >= 16)
                {
                    flag = temp/16;
                    temp %= 16;
                }
                if (temp>=10&&temp<16){
                    temp = temp +87;
                }else{
                    temp = temp +'0';
                }
                res[count3++] = temp;
            }
            while (count2>=0)  //2数的高位 累加进位处理
            {
                int temp;
                if(num2[count2]>='a'&&num2[count2]<='f'){
                   temp = num2[count2--] - 87 + flag;
                }else{
                   temp = num2[count2--] - '0' + flag;
                }
                flag = 0;
                if (temp >= 16)
                {
                    flag = temp/16;
                    temp %= 16;
                }
                if (temp>=10&&temp<16){
                    temp = temp +87;
                }else{
                    temp = temp +'0';
                }
                res[count3++] = temp;
            }
        }
        for (i = count3-1; i >=0; i--)
        {
            printf("%c", res[i]);
        }
        printf("\n");

    }
}

 

posted @ 2022-03-13 22:32  梦想是能睡八小时的猪  阅读(81)  评论(0)    收藏  举报