截取字符串
2019华东师范大学计科机试
Problem B. 和
如果学过计算机网络,应当了解 TCP/UDP 的校验和。校验和是一种常见简单的检错方法,也称为循 环进位求和。计算步骤为: ·
1将二进制的原数据按 k 位一组进行分组(其中 k 通常是 2 的幂,但此题中未必)例如 UDP 中取 16,即两个字节
2将各组相加,相加过程中若产生进位,需要回卷到低位。如果仍有进位则再次回卷,直至数据小于 2^k 为止
3最后将得到的和取反码即得所求样例 1
输入 4 101101100111
输出 0110
样例 2
输入 16 1111111111111111
输出 0000000000000000
样例 3
输入 16 10100000110000111110100101001000
输出 0111010111110011
#include<iostream>
#include<cstring>
using namespace std;
int main(){
int k, i, j;
string str;
cin>>k>>str;
int num = str.length(), team = num/k;
string s[team];
int t[k];
for(i=0; i<team; i++)
s[i].assign(str, k*i, k);
int temp=0; //进位
for(i=k-1; i>=0; i--){
int sum=0; //当前位的和
for(j=0; j<team; j++)
sum+=(s[j][i] - '0');
sum+=temp;
t[i] = sum%2;
temp = sum/2;
}
if(temp)
for(i=k-1; i>=0; i--){
t[i]+=temp;
temp = t[i]/2;
t[i]%=2;
if(i==0 && temp)i=k-1;
}
//取反并输出
for(i=0; i<k; i++){
t[i] = (t[i]+1)%2;
cout<<t[i];
}
return 0;
}