首页 > 代码库 > 湘潭大学OJ1200ProblemCRC(摸拟,坑题)
湘潭大学OJ1200ProblemCRC(摸拟,坑题)
题目描述
现实中的网络通讯不够理想,经常会有bit从0变1,从1变0...为了检验是否出错 需要用到循环冗余校验CRC
CRC冗余检验码包含两个部分 k位信息位+n位校验位,可由以下的步骤得到:
1.将要传送的数据分段,每段k个bit,如果不足k位用0补齐
2.对于每个长度为k的01序列M, 先在M后面加n个0得到新的M‘.
3.选定一个(n+1)位的01序列做为除数P,对M‘做**模2的除法,得到一个n位的余数R(即校验位).
4.将R接到M的后面就得到了M的 CRC冗余检验码
请写一个程序模拟处理出CRC码的过程.
**注意此处模2的除法是不进位的除法,除数和被除数做异或运算。进行异或运算时除数和被除数最高位对齐,按位异或。如图所示
输入
多组样例输入,每个样例有3行. 第一行三个整数m,n,k.(m>0&&m<=200 n>0&&n<=100 m>=n k>0&&k<=100)
m要传送的比特串的长度 , n除数P的位数(实际的校验位长为n-1) , k 每个码元有 k 个比特
第二行 一个m位的字符串 即要传送的序列
第三行 一个n位的字符串 即除数P
输出
每行输出一段码元处理后的CRC码.见样例.
样例输入
15 4 6 101001101001101 1101
样例输出
Case: 1# 101001001 101001001 101000100
题意要注意的是:看注释
#include<stdio.h> int main() { int m,n,k,t=0; int a[205],p[105],MM[205],mk; char ch[205],str[105]; while(scanf("%d%d%d",&m,&n,&k)>0) { scanf("%s",ch); scanf("%s",str); for(int i=0; i<m||i<n; i++) { if(i<m)a[i]=ch[i]-‘0‘; if(i<n)p[i]=str[i]-‘0‘; } printf("Case: %d#\n",++t); int c=m/k,tc=1; if(m%k)c++; while(c--) { mk=0; for(int i=(tc-1)*k ; i<tc*k; i++) if(i<m) MM[mk++]=a[i],printf("%d",a[i]); else MM[mk++]=0,printf("0"); for(int i=0; i<n-1; i++) MM[mk++]=0; for(int tmk=0; tmk+n<=mk; tmk++)//不管第tmk位异或变成1都往下一位开始 { if(MM[tmk]==0) continue; for(int i=0,j=tmk; i<n; i++,j++) MM[j]=MM[j]^p[i]; } for(int j=mk-n+1; j<mk; j++) printf("%d",MM[j]); printf("\n"); tc++; } } }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。