题目链接
本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。
汉字的字形存在于字库中,即便在今天,16*16 点阵的字库也仍然使用广泛。
16*16 点阵的字库把每个汉字看成是 16×16 个像素信息。并把这些信息记录在字节中。
一个字节可以存储 8 位信息,用 32 个字节就可以存一个汉字的字形了。 把每个字节转为 2 进制表示,1 表示墨迹,0 表示底色。每行 2 个字节,一共 16 行,布局是:
这段信息是(一共 10 个汉字):
4 0 4 0 4 0 4 32 -1 -16 4 32 4 32 4 32 4 32 4 32 8 32 8 32 16 34 16 34 32 30 -64 0
16 64 16 64 34 68 127 126 66 -124 67 4 66 4 66 -124 126 100 66 36 66 4 66 4 66 4 126 4 66 40 0 16
4 0 4 0 4 0 4 32 -1 -16 4 32 4 32 4 32 4 32 4 32 8 32 8 32 16 34 16 34 32 30 -64 0
0 -128 64 -128 48 -128 17 8 1 -4 2 8 8 80 16 64 32 64 -32 64 32 -96 32 -96 33 16 34 8 36 14 40 4
4 0 3 0 1 0 0 4 -1 -2 4 0 4 16 7 -8 4 16 4 16 4 16 8 16 8 16 16 16 32 -96 64 64
16 64 20 72 62 -4 73 32 5 16 1 0 63 -8 1 0 -1 -2 0 64 0 80 63 -8 8 64 4 64 1 64 0 -128
0 16 63 -8 1 0 1 0 1 0 1 4 -1 -2 1 0 1 0 1 0 1 0 1 0 1 0 1 0 5 0 2 0
2 0 2 0 7 -16 8 32 24 64 37 -128 2 -128 12 -128 113 -4 2 8 12 16 18 32 33 -64 1 0 14 0 112 0
1 0 1 0 1 0 9 32 9 16 17 12 17 4 33 16 65 16 1 32 1 64 0 -128 1 0 2 0 12 0 112 0
0 0 0 0 7 -16 24 24 48 12 56 12 0 56 0 -32 0 -64 0 -128 0 0 0 0 1 -128 3 -64 1 -128 0 0
题目解析:
本题是一道综合性极强的题目,
第一点,你需要读懂题意:大致意思就是 10个汉字,每个汉字32个字节表示,也就是每行32个字节存储一个汉字。但是你打印的时候需要是每行2字节,打印16行构成一个汉字。
第二点,你需要知道十进制数怎么转换成补码,对于正数:原反补相同,所以我们可以直接用原码。而对于负数,我们是有规定取其原码的补码。
负数补码求法:
法1:先得到负数绝对值二进制,除第一位不变,其他位按位取反,再+1
法2:最后一位向前,直到遇见第一个1,这个1之前的数取反
我这里用的法2
剩下的就是代码实现:我的代码都进行了详细注释,相信你一定可以学会!
题解:
//明码
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int brr[8];
void func(int x)//将十进制x转换成2进制
{
//正数就取其原码,如果是负数的话就取其原码的补码
int i = 0;
int j = 0;
int tmp = abs(x);//abs()为绝对值函数
while (tmp != 0)
{
brr[i] = tmp % 2;
tmp /= 2;
i++;
}
for (i;i < 8;i++)//防止之前有数据残留,本次没有覆盖到全部
{//举个例子:上一个传过来的数为32,那么它的brr为0000 0100
//如果本次传过来的数为-1,那么我们经过abs,也就是获得了1补码0000 0001
//放到brr里,只会覆盖第一位,也就是把brr从0000 0100变成了1000 0100
//但这1000 0100显然不是1的补码,后面的0100就是32带来的数据残留,我们必须要清除掉
brr[i] = 0;
}
//负数补码求法:
//法1:先得到负数绝对值二进制,除第一位不变,其他位按位取反,再+1
//法2:最后一位向前,直到遇见第一个1,这个1之前的数取反
//我这里用的法2
if (x < 0)
{
for (i = 0;i < 8;i++)
{
if (brr[i] == 1 && i < 7)//因为我们上面往brr里面放是反方向放的,也就是brr第一位其实是二进制数最后一位
{
for (j = i + 1;j <= 7;j++)
{
//取反
if (brr[j] == 0)
{
brr[j] = 1;
}
else
{
brr[j] = 0;
}
}
break;
}
}
}
if (x == 0)
{
for (i = 0;i < 8;i++)
{
brr[i] = 0;
}
}
}
int main(int argc, char *argv[])
{
int i = 0;
int j = 0;
int k = 0;
int arr[10][32];//10个汉字,每个汉字32个字节表示,也就是每行32个字节存储一个汉字
//读取数据
for (i = 0;i < 10;i++)//10个汉字
{
for (j = 0;j < 32;j++)//每个汉字32个字节表示
{
scanf("%d", &arr[i][j]);
func(arr[i][j]);
for (k = 7;k >= 0;k--)
{
if (brr[k] == 1)
{
printf("%d", brr[k]);
}
else
{
printf(" ");//这里也可以把空格改成0,我这里是为了方便看
}
}
if (j % 2 == 1)//每行打印2字节
{
printf("\n");
}
}
}
return 0;
}
最后它题目是要一个结果,我们直接打印9^9即可,也就是387420489
注:因为pow函数有坑,建议还是自己写个代码算一下
#include<stdio.h>
int main()
{
int a = 1;
int b = 9;
for (int i = 1;i <= 9;i++)
{
a *= b;
}
printf("%d", a);
return 0;
}