藍橋杯:明碼問題(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次方=387420489
至此,整個題目解答完畢!!!
結語:以上就是我對這個問題的理解、解法,可能存在著更好、更簡潔的解法代碼,希望大家提出來,我們一起討論,交換看法,共同進步。若上述代碼中存在問題,望大家指正,謝謝大家。(∩^∩)
智能推薦
requests實現全自動PPT模板
http://www.1ppt.com/moban/ 可以免費的下載PPT模板,當然如果要人工一個個下,還是挺麻煩的,我們可以利用requests輕松下載 訪問這個主頁,我們可以看到下面的樣式 點每一個PPT模板的圖片,我們可以進入到詳細的信息頁面,翻到下面,我們可以看到對應的下載地址 點擊這個下載的按鈕,我們便可以下載對應的PPT壓縮包 那我們就開始做吧 首先,查看網頁的源代碼,我們可以看到每一...
Linux C系統編程-線程互斥鎖(四)
互斥鎖 互斥鎖也是屬于線程之間處理同步互斥方式,有上鎖/解鎖兩種狀態。 互斥鎖函數接口 1)初始化互斥鎖 pthread_mutex_init() man 3 pthread_mutex_init (找不到的情況下首先 sudo apt-get install glibc-doc sudo apt-get install manpages-posix-dev) 動態初始化 int pthread_...
統計學習方法 - 樸素貝葉斯
引入問題:一機器在良好狀態生產合格產品幾率是 90%,在故障狀態生產合格產品幾率是 30%,機器良好的概率是 75%。若一日第一件產品是合格品,那么此日機器良好的概率是多少。 貝葉斯模型 生成模型與判別模型 判別模型,即要判斷這個東西到底是哪一類,也就是要求y,那就用給定的x去預測。 生成模型,是要生成一個模型,那就是誰根據什么生成了模型,誰就是類別y,根據的內容就是x 以上述例子,判斷一個生產出...
styled-components —— React 中的 CSS 最佳實踐
https://zhuanlan.zhihu.com/p/29344146 Styled-components 是目前 React 樣式方案中最受關注的一種,它既具備了 css-in-js 的模塊化與參數化優點,又完全使用CSS的書寫習慣,不會引起額外的學習成本。本文是 styled-components 作者之一 Max Stoiber 所寫,首先總結了前端組件化樣式中的最佳實踐原則,然后在此基...
猜你喜歡
19.vue中封裝echarts組件
19.vue中封裝echarts組件 1.效果圖 2.echarts組件 3.使用組件 按照組件格式整理好數據格式 傳入組件 home.vue 4.接口返回數據格式...
【一只蒟蒻的刷題歷程】【藍橋杯】歷屆試題 九宮重排 (八數碼問題:BFS+集合set)
資源限制 時間限制:1.0s 內存限制:256.0MB 問題描述 如下面第一個圖的九宮格中,放著 1~8 的數字卡片,還有一個格子空著。與空格子相鄰的格子中的卡片可以移動到空格中。經過若干次移動,可以形成第二個圖所示的局面。 我們把第一個圖的局面記為:12345678. 把第二個圖的局面記為:123.46758 顯然是按從上到下,從左到右的順序記錄數字,空格記為句點。 本題目的任務是已知九宮的初態...
dataV組件容器寬高發生變化后,組件不會自適應解決方法
項目中需要大屏幕數據展示,于是使用了dataV組件,但是使用是發現拖動瀏覽器邊框,dataV組件顯示異常,如圖: 于是查了官網,官網的解釋如下: 于是按照官網的意思編寫代碼: 于是可以自適應了...