EOJ 3037 十六进制加法

写在前面:

hhhhh我又回来了,发现一个学期都没写博客了嗷【捂脸

现在回想起来其实还是有很多可写的内容的,比如计网实验、操作系统改pintos、Linux课后作业……还有这个寒假去杭州参加的Google InnoCamp!(吹爆!)

害,值得写的东西固然有很多,但不写只有一个理由:
不过,慵懒如我还是抵不住被困在家的闲,最近打算更新一波~ 大部分应该是记录最近做到的还不错的OJ题。如果写嗨了可能会写点别的也说不定。

题目:

单点时限: 2.0 sec

内存限制: 256 MB

请编写程序实现两个十六进制整数的加法。

例如:十六进制整数 3762 和 05C3,3762+05C3=3D25

十六进制整数 CB9 和 957,CB9+957=1610

输入格式
第 1 行:一个整数 T (1≤T≤10) 为问题数。

接下来 T 行,每行输入两个十六进制整数 n 和 m (n,m 为不超过 200 位的十六进制整数),A~F 全部为大写字母。 两个整数之间用一个空格分隔。

输出格式
对于每个问题,输出一行问题的编号(0 开始编号,格式:case #0: 等)。然后对应每个问题在一行中输出两个十六进制整数相加的结果,字母全部用大写字母。

样例
Input
3
3762 05C3
CB9 957
F 1
Output
case #0:
3D25
case #1:
1610
case #2:
10

思路:

  1. 设置两个字符数组存储两个加数;
  2. 因为两个数相加是末位对齐,而用字符数组存的两个加数(下标对齐的话)是首位对齐,运算的时候鼓捣下标应该挺麻烦,所以两个数组各一遍循环把其中内容分别放到两个栈里,末位在栈顶;
  3. 设置一个表示进位的变量up,初值为1;
  4. ((两栈顶元素相加+up)%16)压入result栈中,up=(两栈顶元素相加+up)/16 —> 两个加数栈分别pop() …… 直到其中一栈为空。
  5. 再循环,把上轮循环中未空的栈中的元素(注意up值)压入result栈;
  6. 这样得到的result栈就是运算结果了(栈顶为结果首位,栈底为结果末位)。输出即可。

代码:

#include 
using namespace std;

int char_to_int(char c){
    if(c>='0'&&c<='9') return c-'0';
    else return c-'A'+10;
}

char int_to_char(int n){
    if(n>=0&&n<=9) return n+'0';
    else return n-10+'A';
}

int main(){
    int T; scanf("%d\n",&T);
    for(int cas=0;cas<T;cas++){
        char a[208], b[208];
        stack<int> an,bn,result;

        scanf("%s %s",a,b);
        for(int i=0;a[i]!='\0';i++)
            an.push(char_to_int(a[i]));
        for(int i=0;b[i]!='\0';i++)
            bn.push(char_to_int(b[i]));

        int x,y,up=0;
        while(!an.empty()&&!(bn.empty())){
            x=an.top(); y=bn.top();
            result.push((x+y+up)%16);
            up=(x+y+up)/16;
            an.pop(); bn.pop();
        }

        while(!an.empty()){
            x=an.top();
            result.push((x+up)%16);
            up=(x+up)/16;
            an.pop();
        }
        while(!bn.empty()){
            y=bn.top();
            result.push((y+up)%16);
            up=(y+up)/16;
            bn.pop();
        }
        printf("case #%d:\n",cas);
        if(up!=0) printf("1");
        while(!result.empty()){
            printf("%c",int_to_char(result.top()));
            result.pop();
        }
        printf("\n");
    }
    return 0;
}

写在后面:

这道题不难,但是我还是卡了两下。

一是循环结束条件写错了(我真傻真的):
while((!an.empty())&&!(bn.empty()))写成了while(!(an.empty()&&bn.empty()))

二是进位操作有点问题:
应该是把(x+y+up)%16压栈,up=(x+y+up)/16。我一开始是判断(x+y+up)是不是>=16,是的话就把(x+y+up-16)压栈,up=1;
虽然写完博客还是没看出有什么问题……但是肯定是有问题的——要不然为什么WA……
害,等我知道了再回来填坑吧hhh

你可能感兴趣的:(大二下,EOJ)