蓝桥杯—明码(C语言解法)

题目描述

查看原题

思路

  1. 将每一个输入的数字转换为8位二进制数输出即可,注意十六位二进制数为一组(因为是16*16点阵!!注意读题,题目还举例说明了),所以输出两组再换行
  2. 注意负数转换为二进制数时的规则,先求出其相反数的八位二进制数,然后按位取反(不是取相反数,是0变1,1变0 哇),然后加1,注意在二进制数组中,是第七位加1,如果大于等于二,前一位也要加1,本位要模2
  3. 由2知,在遍历负数的相反数的二进制数组时,可以从后(数组下标为7处)遍历
  4. 注意存储二进制数组每次都要初始化为0,用memset()函数,加头文件!!#include<string.h>

代码

#include<stdio.h>
#include<string.h>
int n[35];
int er[8];
void b2(int a){
	memset(er,0,sizeof(er));
	int res=7;//反着存
	int flag=0;
	if(a==0){
		return;
	}
	if(a<0){flag=1;a=-a;}
	while(a!=1){
		er[res--]=a%2;
		a/=2;
	}
	er[res--]=1;//在等于1的时候退出了循环,要把1存进数组
	if(flag){//负数处理
		for(int i=0;i<=7;i++){//按位取反
			if(er[i]==0) er[i]=1; 
			else er[i]=0;
		}
		for(int i=7;i>=0;i--){
			if(i==7) er[i]+=1;
			if(er[i]>=2){
				er[i-1]+=1;
				er[i]%=2;
			}
		}	
	}
}
int main(){
	int i;
	for(i=1;i<=32;i++){
		scanf("%d",&n[i]);
	}
	for(i=1;i<=32;i++){
		b2(n[i]);
		for(int i=0;i<=7;i++){if(er[i])printf("%d",1);
		else printf(" ");}
		if(i%2==0)printf("\n");//2组换行
    }
	return 0;
} 
posted @ 2022-03-30 21:26  两颗不一样的西柚  阅读(155)  评论(0)    收藏  举报