您的位置:首页 > 其它

nyoj244 16进制的简单运算

2015-07-17 12:09 260 查看


16进制的简单运算

时间限制:1000 ms  |  内存限制:65535 KB
难度:1

描述现在给你一个16进制的加减法的表达式,要求用8进制输出表达式的结果。

输入第一行输入一个正整数T(0<T<100000)

接下来有T行,每行输入一个字符串s(长度小于15)字符串中有两个数和一个加号或者一个减号,且表达式合法并且所有运算的数都小于31位
输出每个表达式输出占一行,输出表达式8进制的结果。
样例输入
3
29+4823
18be+6784
4ae1-3d6c


样例输出
44114
100102
6565


注:此题为:南阳oj 题目244  16进制的简单运算

说明:字符串的处理和进制转换

已AC源代码:

#include<stdio.h>
#include<string.h>
int num8[50]; //八进制
int yjj(char ch)
{
int s;
if(ch>='0'&&ch<='9')
s=ch-'0';
else
s=(int)ch-87;
return s;
}
int y_16_10(char ch[],int len) //十六进制变为十进制
{
int i,n,m=0,k=1; //初值
for(i=len-1;i>=0;--i)
{
n=yjj(ch[i]);
m+=(n*k);
k*=16;
}
return m;
}
int y_10_8(int x) //十进制变为八进制 存放在num8[]中
{
int lengh=0;
while(x)
{
num8[lengh++]=x%8;
x/=8;
}
return lengh;
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
char ch[50],ch1[25],ch2[25],c;
int a,b,len,i,j,x,y,k=0;
scanf("%s",ch);
len=strlen(ch);
for(i=0;;i++)
{
if(ch[i]=='+'||ch[i]=='-')
{
c=ch[i]; //运算符用 c 表示
ch1[k]='\0'; //字符串结束标志 '\0'
i++;
break;
}
else
ch1[k++]=ch[i]; //运算符前的字符放在 ch1中
}
k=0;
for(i;i<len;++i) //运算符后的字符放在 ch2中
ch2[k++]=ch[i];
ch2[k]='\0'; //字符串结束标志 '\0'
len=strlen(ch1);
a=y_16_10(ch1,len); //符号前的数
len=strlen(ch2);
b=y_16_10(ch2,len); //符号后的数
switch(c)
{
case '+':
x=a+b; break;
case '-':
x=a-b; break;
}
len=y_10_8(x); //十进制变为八进制
for(i=len-1;i>=0;--i)
printf("%d",num8[i]);
printf("\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息