蓝桥杯2018第九届C语言B组省赛习题题解——习题B.明码(暴力破解密码)

每日刷题(四十三)

蓝桥杯第九届C语言B组省赛习题

习题B:明码

在这里插入图片描述
这道题还是很值得细品的,很多人都会被题目太长给吓到,其实这个题考察的东西很少也很简单,就是考十进制转化为二进制外加结果的输出格式构造以及阅读理解能力

他首先说了一个字是16x16,相当于一个二维矩阵,正方形区域。由题意中字的布局可以知道一行字是2个字节,而一个字节是两位,相当于一行要有16位,由0和1组成。题目下方给出了十行的数据,那么一行就是一个汉字。然后直接把数据复制粘贴到终端,因为缓存区的存在,所以可以一次性出结果。当然你们也可以把数据全部存放在一个数组里,到时候一次性输出也是可以的。

这里还有一个要注意的,数据里有正数负数,对于有符号整数转化为二进制数大家在计算机硬件基础这门课应该都学过,这里我就简单说一下把负数转化为二进制数的方法。因为二进制是八位,所以只要求27-1+负数的二进制数。进制转化的思路如图
在这里插入图片描述有关进制转化更多题型可以参看这篇博文蓝桥杯基础练习超全习题题解——BASIC-10~13题(十进制转十六进制、十六进制转十进制、十六进制转八进制、数列排序)

详细C代码如下:

#include<stdio.h>

void tobinary(int n)
{
	int a[8] = {0};
	if(n >= 0)
	{
		int k = n;
		int mod = k;
		int t = 1;
		a[8 - t] = mod;
		while(k)
		{
			mod %= 2;
			k /= 2;
			a[8 - t] = mod;
			mod = k;
			t++;
		}
		for(k = 0; k < 8; k++)
		{
			printf("%d", a[k]);
		}
	}
	else
	{
		int n1 = 128 + n;
		int k = n1;
		int mod = k;
		int t = 1;
		a[0] = 1;
		a[8 - t] = mod;
		while(k)
		{
			mod %= 2;
			k /= 2;
			a[8 - t] = mod;
			mod = k;
			t++;
		}
		for(k = 0; k < 8; k++)
		{
			printf("%d", a[k]);
		}
	}
} 

int main()
{
	int i, j;
	int a1, b1, c1, d1, e1, f1, g1, h1, i1, j1, k1, l1, m1, n1, o1, p1, q1, r1, s1, t1, u1, v1, w1, x1, y1, z1, aa, bb, cc, dd, ee, ff;

	for(i = 0; i < 10; i++)
	{
		scanf("%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d", &a1, &b1, &c1, &d1, &e1, &f1, &g1, &h1, &i1, &j1, &k1, &l1, &m1, &n1, &o1, &p1, &q1, &r1, &s1, &t1, &u1, &v1, &w1, &x1, &y1, &z1, &aa, &bb, &cc, &dd, &ee, &ff);
		tobinary(a1);
		tobinary(b1);
		printf("\n");
		tobinary(c1);
		tobinary(d1);
		printf("\n");
		tobinary(e1);
		tobinary(f1);
		printf("\n");
		tobinary(g1);
		tobinary(h1);
		printf("\n");
		tobinary(i1);
		tobinary(j1);
		printf("\n");
		tobinary(k1);
		tobinary(l1);
		printf("\n");
		tobinary(m1);	 
		tobinary(n1);
		printf("\n");
		tobinary(o1);
		tobinary(p1);
		printf("\n");
		tobinary(q1);
		tobinary(r1);
		printf("\n");
		tobinary(s1);
		tobinary(t1);
		printf("\n");
		tobinary(u1);
		tobinary(v1);
		printf("\n");
		tobinary(w1);
		tobinary(x1);
		printf("\n");
		tobinary(y1);		 
		tobinary(z1);
		printf("\n");
		tobinary(aa);
		tobinary(bb);
		printf("\n");
		tobinary(cc);
		tobinary(dd);
		printf("\n");
		tobinary(ee);
		tobinary(ff);
		printf("\n###############################\n");
	}
	return 0;
} 

部分运行结果如下:
在这里插入图片描述
改良版:

#include<stdio.h>

void tobinary(int n)
{
	char a[8] = {" "};
	if(n >= 0)
	{
		int k = n;
		int mod = k;
		int t = 1;
		a[8 - t] = mod;
		while(k)
		{
			mod %= 2;
			k /= 2;
			a[8 - t] = mod + 48;
			mod = k;
			t++;
		}
		for(k = 0; k < 8; k++)
		{
			if(a[k] == 48)
				a[k] = 32;
		}
		for(k = 0; k < 8; k++)
		{
			printf("%c", a[k]);
		}
	}
	else
	{
		int n1 = 128 + n;
		int k = n1;
		int mod = k;
		int t = 1;
		a[0] = 48;
		a[8 - t] = mod;
		while(k)
		{
			mod %= 2;
			k /= 2;
			a[8 - t] = mod + 48;
			mod = k;
			t++;
		}
		for(k = 0; k < 8; k++)
		{
			if(a[k] == 48)
				a[k] = 32;
		}
		for(k = 0; k < 8; k++)
		{
			printf("%c", a[k]);
		}
	}
} 

int main()
{
	int i, j;
	int a1, b1, c1, d1, e1, f1, g1, h1, i1, j1, k1, l1, m1, n1, o1, p1, q1, r1, s1, t1, u1, v1, w1, x1, y1, z1, aa, bb, cc, dd, ee, ff;

	for(i = 0; i < 10; i++)
	{
		scanf("%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d", &a1, &b1, &c1, &d1, &e1, &f1, &g1, &h1, &i1, &j1, &k1, &l1, &m1, &n1, &o1, &p1, &q1, &r1, &s1, &t1, &u1, &v1, &w1, &x1, &y1, &z1, &aa, &bb, &cc, &dd, &ee, &ff);
		tobinary(a1);
		tobinary(b1);
		printf("\n");
		tobinary(c1);
		tobinary(d1);
		printf("\n");
		tobinary(e1);
		tobinary(f1);
		printf("\n");
		tobinary(g1);
		tobinary(h1);
		printf("\n");
		tobinary(i1);
		tobinary(j1);
		printf("\n");
		tobinary(k1);
		tobinary(l1);
		printf("\n");
		tobinary(m1);	 
		tobinary(n1);
		printf("\n");
		tobinary(o1);
		tobinary(p1);
		printf("\n");
		tobinary(q1);
		tobinary(r1);
		printf("\n");
		tobinary(s1);
		tobinary(t1);
		printf("\n");
		tobinary(u1);
		tobinary(v1);
		printf("\n");
		tobinary(w1);
		tobinary(x1);
		printf("\n");
		tobinary(y1);		 
		tobinary(z1);
		printf("\n");
		tobinary(aa);
		tobinary(bb);
		printf("\n");
		tobinary(cc);
		tobinary(dd);
		printf("\n");
		tobinary(ee);
		tobinary(ff);
		printf("\n###############################\n");
	}
	return 0;
} 

在这里插入图片描述
所以说题目要我们求99
那么答案就是387420489在这里插入图片描述

如果喜欢我的文章,请记得一键三连哦,点赞关注收藏,你的每一个赞每一份关注每一次收藏都将是我前进路上的无限动力 !!!↖(▔▽▔)↗感谢支持,下期更精彩!!!

发布了99 篇原创文章 · 获赞 16 · 访问量 5905

猜你喜欢

转载自blog.csdn.net/qq_44631615/article/details/104827160