- 題目描述:
-
輸入一個字符串,然后對每個字符進行奇校驗,最后輸出校驗后的二進制數(如'3’,輸出:10110011)。
- 輸入:
-
輸入包括一個字符串,字符串長度不超過100。
- 輸出:
-
可能有多組測試數據,對於每組數據,
對於字符串中的每一個字符,輸出按題目進行奇偶校驗后的數,每個字符校驗的結果占一行。
- 樣例輸入:
-
3 3a
- 樣例輸出:
-
10110011 10110011 01100001
- 解題思路
- 剛開始奇偶校驗不知道是什么意思,下面簡單說一下。
- 信息是以比特流的方式傳輸的,類似01000001。在傳輸過程中,有可能會發生錯誤,比如,我們存儲了01000001,但是取出來卻是01000000,即低位由0變成了1。為了檢測到這種錯誤,我們可以通過“奇偶校驗”來實現。假如,我們存儲的數據是一個字節,8個比特位,那我們就可以計算每個字節比特位是1的個數,如果是偶數個1,那么,我們就把第九個位設為1,如果是奇數個1,那么就把第九個位設為0,這樣連續9個字節比特位為1的位數肯定是奇數。這中方法叫做“奇校驗”,“偶校驗”和此類似。當然,在實際應用中,也可以把一個字節的前7位作為數據位,最后一個為作為校驗位。
- 比如說對字符‘3’進行奇偶校驗。'3'的ascii值為51,51對應二進制為 0110011(用七位表示) 其中1的個數為4(偶數)個。所以在最高為添1 所以'3'的奇校驗為10110011
- 另外注意一下十進制轉二進制 循環的寫法 有些博客上是用位操作 &來做的 比如 http://blog.csdn.net/wconvey/article/details/8510943
- 剛開始總是WA 找了很久發現 原來是數組開小了 我開的100 這樣的話會溢出 所以直接報錯 改成105就好了
-
#include<stdio.h> #include<iostream> #include<string.h> using namespace std; int judge[9]; int sum; void toBinary(char c){//字符c ascii值 十進制轉 二進制函數 sum=0; int x; for(int i=0;i<8;i++) judge[i]=0; x=c; // cout<<x<<endl; int i=7; int newx; do{ newx=x/2; int t=x%2; judge[i--]=t; if(t==1) sum++; x=newx; }while(newx!=0); } int main(){ char a[105]; while(cin.getline(a,105)){ for(int i=0;i<strlen(a);i++){ char ch=a[i]; if(ch=='\0') break; //ch是當前字符 toBinary(ch); // cout<<"sum="<<sum<<endl; if(sum%2==1) judge[0]=0; else judge[0]=1; for(int i=0;i<8;i++) printf("%d",judge[i]); printf("\n"); } } }
