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
至此,整個題目解答完畢!!!
結語:以上就是我對這個問題的理解、解法,可能存在着更好、更簡潔的解法代碼,希望大家提出來,我們一起討論,交換看法,共同進步。若上述代碼中存在問題,望大家指正,謝謝大家。(∩^∩)