题目:
问题 E: 16进制的简单运算(循环)
时间限制: 1 Sec 内存限制: 128 MB
提交: 579 解决: 354
[提交][状态][讨论版]
题目描述
现在给你一个16进制的加减法的表达式,要求用8进制输出表达式的结果。
输入
第一行输入一个正整数T(0<T<100000)
接下来有T行,每行输入两个数和一个加号或者一个减号,且表达式合法并且所有运算的数都小于31位
输出
每个表达式输出占一行,输出表达式8进制的结果。
样例输入
3
29+4823
18be+6784
4ae1-3d6c
样例输出
44114
100102
6565
代码块:
#include <stdio.h>
int main(void)
{
int i, t;
int a, b;
char c;
scanf("%d", &t);
for(i=0; i<t; i++)
{
scanf("%x%c%x", &a, &c, &b);
if('+'==c)
printf("%o\n", a+b);
else
printf("%o\n", a-b);
}
return 0;
}
题解:本题中输入的是两个十六进制数相加或相减的字符串,使用scanf输入时明显会遇到一些问题,首先对于scanf和printf,其整型十六进制的格式控制为%x或%X,整型八进制格式控制%o,整形十进制为%d,无符号整型十进制为%u,其次scanf在读输入的字符串时,应该人为用各种格式控制将其中不同含义和类型的字符区分开,如这里输入的本质是一个十六进制整数加一个运算字符加另一个十六进制整数,在这里中间的运算字符可能为加可能为减因此要用%c控制,而如果这里只有加号的情况就无需%c了,直接用+就行。格式控制的意义即在于处理“字符串中的某个部位可能出现多种同一类的字符,而不是确定的出现某个字符”的情况。