题目链接
本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。
汉字的字形存在于字库中,即便在今天,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#include#includeint 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之前的数取反//我这里用的法2if (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函数有坑,建议还是自己写个代码算一下
#includeint main(){int a = 1;int b = 9;for (int i = 1;i <= 9;i++){a *= b;}printf("%d", a);return 0;}