FZU 1078 计算循环冗余码【模拟】

计算机网络中采用循环冗余码来校验数据的正确性。其原理是:发送方计算出待发送的二进制数据的循环冗余码,并随同原数据一起发送到接收方;接收方通过重新计算接收到的数据的循环冗余码,并和收到的循环冗余码进行比较,如果两者相同则可判定所收到的数据是正确的,否则说明数据是错误的。其中计算二进制数据的循环冗余码的计算过程如下:

1.协议事先约定一个二进制生成表达式,本题设为10011;
2.将待发送的二进制数据串的末尾加4个0;
3.将补上0的数据串按模2除法除于生成表达式,取余数;
4.该余数就是该二进制数据串的循环冗余码。

例如:

数据串为:1101011011
生成表达式为:10011
循环冗余码为:1110

计算过程如下: 

根据上述的计算方法,请编写一个循环冗余码计算程序,假设二进制数据串的长度不超过20位,生成表达式固定为10011。

Input

输入的第一行含一个正整数k (1<=k<=10),表示测试例的个数。后面紧接着k行,每行对应一个测试例,含一个N位二进制串(1<=N<=20),代表数据。

Output

每个测试例对应一行输出,含一个5位二进制串,表示循环冗余码。

Sample Input

2
1101011011
10101010

Sample Output

01110
01001


【分析】:首先要了解循环冗余校验码是什么。

循环冗余校验码是通过除法运算来建立有效信息位和校验位之间的约定关系。假定,待编码的有效信息以多项式M(X)表示,将它左移若干位后,用另一个约定的多项式G(X)去除,所产生的余数就是校验位。有效信息位与校验位相拼接就构成了CRC码。当接收方收到发来的CRC码后,他仍用约定的多项式G(X)去除,若余数为0,表明该代码接收无误;若余数不为0,表明某一位出错,再进一步由余数值确定出错的位置,并予以纠正。

循环冗余校验码的编码方法:

循环冗余校验码由两部分组成,左边为信息位,右边为校验位。若信息位为N位,校验位为K位,则该校验码被称为(N+K,N)码。

这里,需介绍一下模2的运算规则。模2运算不考虑加法的进位和减法的借位即0±0=0,0±1=1,1±0=1,1±1=0。作模2除法时,上商的原则是当部分余数首位是1时(即使被除数比除数小),商取1,反之商取0,然后按模2加减求得余数。当被除数逐步除完时,最终的余数比除数少一位,此余数就是校验位。

对“模2除法”进行说明:

“模2除法”与“算术除法”类似,但它既不向上位借位,也不比较除数和被除数的相同位数值的大小,只要以相同位数进行相除即可。模2加法运算为:1+1=0,0+1=1,0+0=0,无进位,也无借位;模2减法运算为:1-1=0,0-1=1,1-0=1,0-0=0,也无进位,无借位。相当于二进制中的逻辑异或运算

g(x)和h(x)的除运算,可以通过g和h做xor(异或)运算。二进制相除就是一个异或的过程。比如将11001与10101做xor运算:

明白了xor运算法则后,举一个例子使用CRC-8算法求101001110100001的效验码。CRC-8标准的h(x) = x^8 + x^7 + x^6 + x^4 + x^2 + 1,既h是9位的二进制串111010101。

经过迭代运算后,最终得到的r是10001100,这就是CRC效验码。

【代码】:明白原理后就是简单模拟。

#include <iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
#include<streambuf>
#include<cmath>
#include<string>
using namespace std;
#define ll long long
#define oo 10000000

int n,m;
char b[]="10011";
int main()
{
    string a;
    int t;
    scanf("%d",&t);
    while(t--)
    {
        cin>>a;
        a=a+"0000";
        for(int i=0;i<a.size()-4;i++)
        {
            if(a[i]==‘0‘)
            {
                continue;
            }
            int p=i;
            for(int j=0;j<5;j++,p++)
            {
                if(a[p]^b[j])
                    a[p]=‘1‘;
                else
                    a[p]=‘0‘;
            }
        }
        for(int i=a.size()-5;i<a.size();i++)
            printf("%c",a[i]);
        printf("\n");
    }
    return 0;
}

模拟

时间: 2024-10-28 16:30:02

FZU 1078 计算循环冗余码【模拟】的相关文章

FZU 2152 文件系统 (小模拟)

       Problem 2152 文件系统 Time Limit: 1000 mSec    Memory Limit : 32768 KB Problem Description 每个Linux文件具有四种访问权限:可读(r).可写(w).可执行(x)和无权限(-). 利用ls -l命令可以看到某个文件或目录的权限,它以显示数据的第一个字段为准.第一个字段由10个字符组成,如下: -rwxr-xr-x 第1位表示文件类型,-表示文件,d表示目录 2-4位表示文件所有者的权限,u权限 5-

FZU 1893 内存管理 模拟

比赛的时候队友要做这道题…… 他没做出来自己也被误导了…… 也算是个教训 自己还是要有自己的思路…… 又是模拟题…… 网上都是用vector做的 我最近才会stl 怎么会用那么高大上的的东西…… 强力模拟一波内存…… 反正只有100的大小 随意遍历…… 模拟都做不出来 只能说明真的方了…… 只要心态稳定 模拟都是水题…… 1 #include<stdio.h> 2 #include<string.h> 3 int memory[102]; 4 int room[102]; 5 in

#个人赛第七场解题总结# (FZU 1881三角形问题 找规律 &amp;&amp;FZU 1884 排火车 模拟)

链接:click here~~ ,密码:nyist C - 三角形问题 Description 给你一个由无穷个节点组成的三角形(如下图),你的任务很简单--任意给你两个正整数x和y,判断它们是否相邻(重合不是相邻). Input 第一行T,表示T组测试数据,接下来仅有两个32位正整数x 和y. Output 对于每组测试数据,首先输出"Case k:",其中k表示第几组.然后如果x和y相邻,则输出"Yes",否则输出"No". Sample I

计算客模拟赛1、小区划分

小区划分 1000ms 262144K 一条街道的两侧各连续坐落着 NN 座单元楼.现在要为这些单元楼划分居民校区. 规则如下: 每个小区只能由同一侧连续的若干座单元楼组成.且两侧都恰有 KK 个小区(每个小区至少有一栋楼). 两侧的小区划分规则应该相同,比如,若左边的房子被分成 \{1,2\},\{3\}{1,2},{3} 这两个小区,那么右边也应该如此. 这样两边合计一共有 KK 对小区. 用 a_i,b_ia?i??,b?i?? 表示左右两边每座楼的人口在同侧所有单元楼总人口中所占的百分比

FZU - 2159 - WuYou (模拟= =!)

Problem 2159 WuYou Accept: 78    Submit: 405 Time Limit: 1000 mSec    Memory Limit : 32768 KB  Problem Description 有两个正整数A和B,这两个数的位数相同且不含前缀0.A的一些位不能够确定,用'?'代替.已知A是满足 A < B 的最大的A.求A .  Input 第一行一个整数T(T<=1000),表示有T组数据. 每组数据两行,第一行为A,第二行为B(0 < A,B &l

[LeetCode] 数学计算模拟类问题:除法和幂,注意越界问题。题 Pow(x, n) ,Divide Two Integers

引言 数学计算的模拟类题目,往往是要求实现某种计算(比如两数相除),实现的过程中会有所限定,比如不允许乘法等等. 这类题目首先要注意计算过程中本身的特殊情况.比如求相除,则必须首先反映过来除数不能为0. 其次要记得考虑负数的情况,如果计算范围不单单是整数,还要考虑double的比较方式. 最后要注意越界情况,这个是最容易犯错的,只能具体问题具体分析. 例题 1 Pow(x, n) Implement pow(x, n). class Solution { public: double pow(d

瞎谈“认识计算”

阿尔法狗赢了之后,最近关于人工智能的文章铺天盖地,颇有当年纳米材料的风范,但是其中有多少人是真明白,有多少人是跟风,有多少人纯粹是为了炒作,不得而知.曾经在人工智能方面,我也是下过一段时间的苦功夫,但是因为近两年在这方面钻研不够,所以不敢跟风妄谈,只敢瞎谈,纯属作为对自己在这方面的一些想法的记录,欢迎批评指正,不可作为参照. 阿尔法狗这件事情之后,关注人工智能,才发现了"认知计算"这个概念.个人感觉,目前从网络上收集的资料来看,尤其是国内的资料,这个概念离不开IBM以及IBM的&quo

基于AWS云服务的巨型数据集与大规模计算的应用架构

AWS对于大规模计算方案是很受欢迎的,如科学计算,模拟和研究项目.这些方案包括从科研设备,测量设备,或其他计算作业的大量数据集的采集.采集后,使用大规模计算作业的分析来生成最终数据集.通常,这些结果将提供给更多的受众. 1.  为了将大数据集上传到AWS,关键是拥有最多的可用带宽. 通过多客户端的并行处理,就可以把数据上传到S3, 每个客户端采用多线程技术实现并行上传或上传多部分以便进一步并行处理.像窗口调整和确认选择等TCP设置是可以调整的,以便进一步增强吞吐量. 通过适当的优化,一天上传几T

理工科应该的知道的C/C++数学计算库(转)

理工科应该的知道的C/C++数学计算库(转) 作为理工科学生,想必有限元分析.数值计算.三维建模.信号处理.性能分析.仿真分析...这些或多或少与我们常用的软件息息相关,假如有一天你只需要这些大型软件系统的某一个很有限的功能,你是不是也要因此再用一用那动辄几个g的软件呢?其实我觉得如果系统不是很大,不是很复杂,我们个人完全有可能自己去编写代码来实现这些‘’有限的功能‘’.别以为这是件很困难的事情,我总以为大学期间学的c语言是极其有用的,只要你会基本的c语言语法,你就可以的. 下面我来介绍几个非常