2020 HDU校赛 Problem I
Posted hhlya
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2020 HDU校赛 Problem I相关的知识,希望对你有一定的参考价值。
题面
Problem Description
在计算机中,对于定点数有三种不同的表示方法。在本题中,假定码的长度固定为8位,从左往右依次编号为第1到8位,第1位为最高位。
x的原码:最高位为符号位,正数符号位为0,负数符号位为1,第2到7位为x的二进制表示。正负0的原码不同。
x的反码:原码符号位除外,其他位按位取反,即1变0,0变1。
x的补码:正数的补码等于原码,负数的补码等于反码+1,因此正负0的补码相同。
给定整数x,请给出它的原码、反码和补码。
Input
第一行包含一个正整数T(1≤T≤300),表示测试数据的组数。
每组测试数据包含一行,首先是一个符号"+‘‘或"-‘‘,表示x的正负,然后是一个非负整数y(0≤y≤100),表示x的绝对值为y。
Output
对于每组数据,输出三行,第一行为原码,第二行为反码,第三行为补码。
Sample Input
4
+0
+1
-0
-3
Sample Output
00000000
01111111
00000000
00000001
01111110
00000001
10000000
11111111
00000000
10000011
11111100
11111101
思路
码制的转换,根据二进制转换成相对于的编码就可以了。
代码实现(比赛的时候写的,有点乱,将就看)
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<queue>
#include<cmath>
using namespace std;
int main () {
int t;
cin>>t;
while (t--) {
int num,temp;
char zf;
int s[8];
cin>>zf;
cin>>num;
int ans=num;
memset (s,0,sizeof (s));
int its=0;
while(num!=0) {
temp=num%2;
s[its]=temp;
its++;
num/=2;
}
if (zf==‘-‘) cout<<1;
if (zf==‘+‘) cout<<0;
if (ans!=0)for(int j=6;j>=0;j--) { //算出原码
cout<<s[j];
}
else if (ans==0) {
for (int i=6;i>=0;i--) {
s[i]=0;
cout<<s[i];
}
}
cout<<endl;
int k[8];
if (zf==‘-‘) cout<<1;
if (zf==‘+‘) cout<<0;
for (int j=6;j>=0;j--) {
if (s[j]==0) k[j]=1; //反码处理
else k[j]=0;
cout<<k[j];
}
cout<<endl;
if (zf==‘+‘) {
cout<<0;
for (int i=6;i>=0;i--) cout<<s[i];
cout<<endl;
}
else if (ans==0) cout<<"00000000"<<endl;
else {
if (zf==‘-‘) cout<<1;
if (zf==‘+‘) cout<<0;
for (int i=0;i<=6;i++) {
if (k[i]==0) {
k[i]=1;
break;
}
if (k[i]==1) k[i]=0;
}
for (int i=6;i>=0;i--) cout<<k[i];
cout<<endl;
}
}
return 0;
}
以上是关于2020 HDU校赛 Problem I的主要内容,如果未能解决你的问题,请参考以下文章
HDU校赛 | 2019 Multi-University Training Contest 3