16进制的简单运算


时间限制: 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

====================

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值