C语言蓝桥杯刷题:明码

题目链接
本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。

汉字的字形存在于字库中,即便在今天,16*16 点阵的字库也仍然使用广泛。

16*16 点阵的字库把每个汉字看成是 16×16 个像素信息。并把这些信息记录在字节中。

一个字节可以存储 8 位信息,用 32 个字节就可以存一个汉字的字形了。 把每个字节转为 2 进制表示,1 表示墨迹,0 表示底色。每行 2 个字节,一共 16 行,布局是:
C语言蓝桥杯刷题:明码_第1张图片
这段信息是(一共 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
#include
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;
}

C语言蓝桥杯刷题:明码_第2张图片
C语言蓝桥杯刷题:明码_第3张图片
C语言蓝桥杯刷题:明码_第4张图片
C语言蓝桥杯刷题:明码_第5张图片
最后它题目是要一个结果,我们直接打印9^9即可,也就是387420489
注:因为pow函数有坑,建议还是自己写个代码算一下

#include
int main()
{
	int a = 1;
	int b = 9;
	for (int i = 1;i <= 9;i++)
	{
		a *= b;
	}
	printf("%d", a);
	return 0;
}

C语言蓝桥杯刷题:明码_第6张图片

你可能感兴趣的:(蓝桥杯,蓝桥杯,c语言,明码)