问题 E: 类型转换
题目描述
输入
输出
样例输入
233 threeByte oneByte
样例输出
-23
提示
在计算机中数据存储以补码形式。
正数的原码、反码、补码都相同。
负数的补码是原码求反码后再加1.
#include<bits/stdc++.h>
using namespace std;
long long int n,k;
int flag;
char a[20],b[20];
int q[100];
int change(int x,int y)
{
k=0;
memset(q,0,sizeof(q));
if(n>=0)
{
for(int i=1;i<=x;i++)
{
q[i]=n%2;
n=n/2;
}
}
else
{
n=-n;
flag=0;
for(int i=1;i<x;i++)
{
if(flag==1&&n%2==0)
{
q[i]=1;
}
else
if(flag==1&&n%2==1)
{
q[i]=0;
}
if(flag==0&&n%2==0)
{
q[i]=0;
}
else
if(flag==0&&n%2==1)
{
flag=1;
q[i]=1;
}
n=n/2;
}
q[x]=1;
}
int flag1=0;
if(q[y]==1)
{
for(int i=1;i<y;i++)
{
if(flag1==1&&q[i]==0)
{
q[i]=1;
}
else
if(flag1==1&&q[i]==1)
{
q[i]=0;
}
if(flag1==0&&q[i]==0)
{
q[i]=0;
}
else
if(flag1==0&&q[i]==1)
{
flag1=1;
q[i]=1;
}
k=k+q[i]*pow(2.0,i-1);
}
printf("-%lld\n",k);
}
else
{
for(int i=1;i<=y;i++)
{
k=k+q[i]*pow(2.0,i-1);
}
printf("%lld\n",k);
}
}
int main()
{
map<string,int>m;
m["oneByte"]=8;
m["threeByte"]=24;
m["fiveByte"]=40;
m["sevenByte"]=56;
while(~scanf("%lld %s %s",&n,a,b))
{
if(m[a]<=m[b])
{
printf("%lld\n",n);
}
else
{
change(m[a],m[b]);
}
}
}