蓝桥杯:明码问题(C++)

1、问题描述
汉字的字形存在于字库中,即便在今天,16点阵的字库也仍然使用广泛。
16点阵的字库把每个汉字看成是16x16个像素信息。并把这些信息记录在字节中。

一个字节可以存储8位信息,用32个字节就可以存一个汉字的字形了。
把每个字节转为2进制表示,1表示墨迹,0表示底色。每行2个字节,
一共16行,布局是:

第1字节,第2字节
第3字节,第4字节
....
第31字节, 第32字节

这道题目是给你一段多个汉字组成的信息,每个汉字用32个字节表示,这里给出了字节作为有符号整数的值。

题目的要求隐藏在这些信息中。你的任务是复原这些汉字的字形,从中看出题目的要求,并根据要求填写答案。

这段信息是(一共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

2、我对这个问题的看法
这个题目的本质是想让我们了解字符在计算机中的二进制表示形式。我们首先要了解补码的作用,所谓的补码,就是计算机用于表示像+10、-20这样有符号数的方式。所以这题主要是考察我们如何用代码把一个有符号的十进制数转化成二进制补码形式。在完成进制的转化后,就会得到真正的题目,在编写代码解题即可。

3、我的解题思想
(1)首先由编写一个实现将有符号的十进制数转化成二进制的函数toBinary();函数具体的算法思想在下面会详细介绍。
(2)接着写输入数据,将输入的数完成进制转化(调用toBinary函数),并显示一个完整的16×16的点阵的函数displayChinese()函数。
(3)然后写main()函数,多次调用displayChinese()函数,得到真正的题目。
(4)编写代码,解题即可。

4、注意点
(1)有符号十进制数转化为二进制数采用除二取余法。
(2)有符号十进制数在计算机中是以补码形式表示的。
(3)负数的补码=符号位1+(负数+128)的七位二进制
例如:
-1 补码 =11111111
127的补码=01111111
不难看出,只有符号位不一样。
(4)在进制转换的过程中,要注意到不同类型数据之间的转化,字符型=数字型+‘0’。
(5)字符串数组在结束最好要加一个结束符 ‘\0’,不然可能输出乱码。

5、关键代码部分详解
关键代码:toBinary函数

函数算法思想:除二取余法

具体代码:

void toBinary(int n,char bin[9])    //n表示要转换的十进制数,字符型数组用于存放转换得到的二进制形式; 
{
	if(n>=0)                        //当n是非负数时; 
	{
		bin[0]='-';                 //非负数的二进制第一位都是0,用符号"-"代替; 
		for(int i=1;i<8;i++)        //转换余下的7位; 
		{
			if((n%2+'0')=='1')      //判断该位是否是1;若是1,用符号"$"代替;注意:n是个数,要加'0',才能变成字符; 
				bin[8-i]='$';       //若是1,用符号"$"代替; 
			else 
				bin[8-i]='-';       //若是0,用符号"-"代替;
			n=n/2;                  //移位到下一位; 
		}
	}
	else                             //当n为负数时; 
	{ 
		bin[0]='$';                  // 负数的二进制第一位都是1,用符号"$"代替;
		n=n+128;                     //负数和非负数之间的补码表示关系,详见上一部分; 
		for(int i=1;i<8;i++)                
		{
			if((n%2+'0')=='1')
				bin[8-i]='$';         //该部分与非负数的转换方法类似; 
			else
				bin[8-i]='-';
			n=n/2;
		}
	}
	bin[8]='\0';                    //在结尾加一个结束符; 
	cout<<bin;
}

6、完整代码

#include<iostream>
using namespace std;

void toBinary(int n,char bin[9])    //n表示要转换的十进制数,字符型数组用于存放转换得到的二进制形式; 
{
	if(n>=0)                        //当n是非负数时; 
	{
		bin[0]='-';                 //非负数的二进制第一位都是0,用符号"-"代替; 
		for(int i=1;i<8;i++)        //转换余下的7位; 
		{
			if((n%2+'0')=='1')      //判断该位是否是1;若是1,用符号"$"代替;注意:n是个数,要加'0',才能变成字符; 
				bin[8-i]='$';       //若是1,用符号"$"代替; 
			else 
				bin[8-i]='-';       //若是0,用符号"-"代替;
			n=n/2;                  //移位到下一位; 
		}
	}
	else                             //当n为负数时; 
	{ 
		bin[0]='$';                  // 负数的二进制第一位都是1,用符号"$"代替;
		n=n+128;                     //负数和非负数之间的补码表示关系,详见上一部分; 
		for(int i=1;i<8;i++)                
		{
			if((n%2+'0')=='1')
				bin[8-i]='$';         //该部分与非负数的转换方法类似; 
			else
				bin[8-i]='-';
			n=n/2;
		}
	}
	bin[8]='\0';                    //在结尾加一个结束符; 
	cout<<bin;
}

void displayChinese()
{
	int a,b;
	char abin[9],bbin[9];
	for(int i=0;i<16;i++)
	{
		cin>>a>>b;
		toBinary(a,abin);
		toBinary(b,bbin);
		cout<<endl;
	}
}

int main()
{
	int a,b;
	char abin[9],bbin[9];
	for(int i=0;i<10;i++)
	{
		displayChinese();
		cout<<"+++++++++++++++++++++++++++++++++++++++++++++++++++++";  //加一条分割线; 
		cout<<endl;
	}
	return 0;
}

7、代码执行结果
在这里插入图片描述
8、得到真正的题目
从图片中不难看出,本题是要求计算9的9次方等于多少?
解题代码如下:

#include<iostream>
#include<cmath>           //调用数学库函数要引用cmath;  
using namespace std;

int main()
{
	int n;
	n=pow(9,9);  //数学库函数,函数原型pow(x,y),用于计算x的y次方;
	cout<<n; 
	return 0;
}

运行结果:
计算9的9次方
即:9的9次方=387420489

至此,整个题目解答完毕!!!

结语:以上就是我对这个问题的理解、解法,可能存在着更好、更简洁的解法代码,希望大家提出来,我们一起讨论,交换看法,共同进步。若上述代码中存在问题,望大家指正,谢谢大家。(∩^∩)

发布了12 篇原创文章 · 获赞 3 · 访问量 392

猜你喜欢

转载自blog.csdn.net/weixin_45620022/article/details/104844348