Problem Description
计算机中的数据,其本质都是以二进制码存储。计算机系统的内存储器,是由许多称为字节的单元组成的,1个字节由8个二进制位构成,每位的取值为0或1。最右端的那1位称为“最低位”;最左端的那1位称为“最高位”。
数字在计算机中的表示方法有原码、反码和补码。
原码:最简单的机器数表示法。用最高位表示符号位,‘1’表示负号,‘0’表示正号。其其余位存放该数的绝对值的二进制。
反码:正数的反码与原码相同,负数的反码符号位为1不变,其余各位按位取反(1变0、0变1)
补码:正数的补码与原码相同,负数的补码是在其反码的基础上+1。
本题要求给定一个8位的原码,求出其补码。
Input
第一行一个T(1=<T<=255),表示有T组数据
以下T行,第i(1=<i<=T)行是一个8位的二进制数,表示一个数的原码
Output
对于每行输入的原码,求出它的补码,并在一行中输出。
Sample Input
2
10101010
01010101
Sample Output
11010110
01010101
Hint
输入数据不存在负零,也就是说,输入的原码可能是 00000000 ,不会有 10000000
Source
shining
#include <stdio.h>
#include <stdlib.h>
int main()
{
char a[9];
//使用字符串储存字符;
int t,i;
scanf("%d",&t);
while (t--)
{
scanf("%s",a);
if (a[0] == '1')
//先转化为反码,负数需要转化,正数不需要转化;
{
for (i = 1; i < 8; i++)
{
if (a[i] == '1')
{
a[i] = '0';
}
else
{
a[i] = '1';
}
}
}
if (a[0] == '1')
//转化为补码,负数需要转化,正数不需要转化;
{
for (i = 7; i >= 0 ; i--)
{
if (i == 7)
//对最有一个字符加一;
{
a[i] = a[i] + 1;
}
if (a[i] == '2')
//因为为二进制,所以遇二进一;
{
a[i] = '0';
a[i - 1] = a[i - 1] + 1;
}
}
}
for (i = 0;i < 8;i++)
{
printf("%c",a[i]);
}
printf("\n");
}
return 0;
}
2837

被折叠的 条评论
为什么被折叠?



