题目意思:
现在给你一个16进制的加减法的表达式,要求用8进制输出表达式的结果。
-
输入
-
第一行输入一个正整数T(0<T<100000)
接下来有T行,每行输入一个字符串s(长度小于15)字符串中有两个数和一个加号或者一个减号,且表达式合法并且所有运算的数都小于31位
输出
- 每个表达式输出占一行,输出表达式8进制的结果。
http://acm.nyist.net/JudgeOnline/problem.php?pid=244
此题为简单题,只是练习了sscanf()函数的用法下面源代码1和2(均正确):
源代码1:
/**此题主要练习了sscanf函数的用法
不是最优算法,另一算法在下面
***/
#include<cstdio>
#include<cstdlib>//strtol()
#include<cctype>
using namespace std;
int main()
{
int n;
scanf("%d",&n);
while(n--){
char ch,c[20];
scanf("%s",c);
for(int i=0;i<strlen(c);i++){//判断加减
if(c[i]=='+'||c[i]=='-'){
ch=c[i];break;
}
}
char a[20],b[20];
sscanf(c,"%[^+,^-]",a);//取得c中+,-前面的字符串存入a
if(ch=='+')
sscanf(c,"%*[^+]+%s",b);//取得+后面的字符串存入b
if(ch=='-')
sscanf(c,"%*[^-]-%s",b);//取得-后面的字符串存入b
int i,j;
//printf("%s %s\n",a,b);
i=strtol(a,NULL,16);//字符串转化为16进制数
j=strtol(b,NULL,16);//字符串转化为16进制数
if(ch=='+') printf("%o\n",i+j);//已8进制输出
if(ch=='-') printf("%o\n",i-j);
}
return 0;
}
源代码2:
#include<stdio.h>
int main()
{
int t;
scanf("%d",&t);
while(t--){
int a,b,d;char c;
scanf("%x%c%x",&a,&c,&b);//x%代表16进制,例%d代表10进制
if(c=='+') d=a+b;
else d=a-b;
if(d>=0) printf("%o\n",d);//o%代表8进制
else printf("-%o\n",-d);//注意负值的输出
}
return 0;
}