时间限制: 1 Sec 内存限制: 128 MB
题目描述
给一个16进制的加减法的表达式,要求用8进制输出表达式的结果。
输入
第一行输入一个正整数n(0<n<100)。
接下来有n行,每行输入一个字符串s(长度小于15),字符串中有两个十六进制无符号整数和一个加号或者一个减号,表达式合法并且所有运算的数都小于31位。
输出
每个表达式输出占一行,输出表达式8进制的结果。
样例输入
3
9527-4381
58+6D10
17A0+C124
样例输出
50646
66550
154304
杂谈
这玩意完全就是考稳健性,读入16进制字母可能是小写的,输入中可能含空白字符,但是完全没有提示,调试的时候真的会疯。而且有一说一,数据长度吹得挺厉害的,我觉得这个样例int都能过,当然,由字符串长度最长不过long long(这么说的话,说小于31位好像也没毛病)
但是,不会吧,不会吧,不会真有人以为小于31位是十进制位吧???不会这人是我吧????
代码
看错题之瞎写代码
#include<stdio.h>
int readst(char *,int *,int *);/*读取字符串并将其中小写字母转化为大写字母
返回符号所在位置的下标,并且初始化f,l的值
*/
long long numread(char *,int ,int );/*从字符串中获取数字并且将其转化为十
进制(屏蔽数字开始前空白字符)*/
void numprint(long long);//将一个十进制长整型数转化为8进制输出
int main () {
int n;
scanf("%d",&n);
while (n--) {
char st[101];
int l,f,r=readst(st,&f,&l);
long long n1=numread(st,0,r-1),n2=numread(st,r+1,l-1);
if(f) n1+=n2;
else {
if(n1<n2) {
printf("-");
n1=n2-n1;
}
else n1-=n2;
}
numprint(n1);
}
return 0;
}
int readst(char *num,int *fu,int *l) {
char ch=getchar();
int i=0,ans;
while (ch==' '||ch=='\n') ch=getchar();
//先把空白字符清一清(不能省,第一次循环之前scanf才读入过,所以必有空白字符)
while (ch!='\n'&&ch!=EOF) {
if(ch=='-'||ch=='+') {
ans=i;
if(ch=='+') *fu=1;
else *fu=0;
}
else if(ch<='f'&&ch>='a') ch-=32;
num[i++]=ch;
ch=getchar();
}
num[i]='\0';
*l=i;
return ans;
}
long long numread (char *num,int l,int r) {
while ((num[l]<'0'||num[l]>'9')&&(num[l]<'A'||num[l]>'F')) l++;
//屏蔽数字前的干扰
if(l>r) return 0;
long long x=0;
for (l;l<=r;l++) {
x*=16;
if(num[l]<='9'&&num[l]>='0') x+=num[l]-'0';
else x+=num[l]-'A'+10;
}
return x;
}
void numprint (long long n) {
int ans[51]={0},i=0;
while (n) {
ans[++i]=n%8;
n/=8;
}//转化成八进制储存
if(i==0) i=1;
while (i) {//倒序输出
printf("%d",ans[i]);
i--;
}
printf("\n");
}
我觉得应该是正解的代码
#include<stdio.h>
int main () {
int x,y,n;
char ch;
scanf("%d",&n);
while (n--) {
scanf("%x %c %x",&x,&ch,&y);//这个必须得加空格
if(ch=='+') x+=y;
else {
x-=y;
if(x<0) {
printf("-");
x=-x;
}
}
printf("%o\n",x);
}
return 0;
}
.
.
…
.
.
.
.
…
.
.
.
.
…
.
.
.
.
…
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
…
.
.
冒死打出来的测试数据
[1.out]
in:
3
9537-4381
58+6ED10
17A0+C128
out:
50666
1566550
154310
====================
[2.out]
in:
40+80
100-27C
out:
300
-574
====================
[3.out]
in:
3
8370+C821D00
54B8-3A00
1- 8
out:
1440520160
15270
-7
====================
[4.out]
in:
1
2B12-7C00
out:
-50356
====================
[5.out]
in:
4
8C12+110A
0492-8B1C
8200-C844
8C12-110A
Right:
116434
-103212
-43104
75410
====================
[6.out]
in:
3
1+2
A+1F
1100+27
out:
3
51
10447
====================
[7.out]
in:
1
8F88-4FFF
out:
37611
====================
[8.out]
in:
2
8B00+0A030
FFFFF-C80031
out:
225460
-56000062
====================
[9.out]
in:
2
909a-82E0
444444-83725C
out:
6672
-17627030
====================
[10.out]
in:
2
C0091+00432
5f738-1c00
out:
3002303
1355470
====================