1、刚开始没读懂题意,什么叫做把字符串看作数字?后来百度了下才知道,原来是将一个字符看作一个256进制的数(有8位,2的8次方是256)。
2、注意题目要输出的是CRC值mod“g"后的十六进制数,所以将字符串转化为数字的时候要随时注意mod”g",然后再用g减去这个值即为CRC值。
3、位运算的时候注意ans<<8一定要包上括号,否则编译器会认为是ans<<8+s[i](s[i]是ASCII码),这样会越界,而且答案也不对。
4、一次AC~发现数学类的题目虽然很难想,但是不像模拟题那样容易错。
#include<cstdio>
int const mod=34943;
int main(){
char s[1100];
int a[4];
while(fgets(s,1100,stdin)!=NULL){
if(s[0]=='#') break;
long long ans=0;
int i=0;
if(s[0]=='\n'){
printf("00 00\n");
continue;
}
while(s[i]!='\n'){
ans=((ans<<8)+s[i])%mod;
i++;
}
ans=(ans<<16)%mod;
ans=mod-ans;
for(int i=3;i>=0;i--){
a[i]=ans%16>=10?'A'+ans%16-10:'0'+ans%16;
ans>>=4;
}
printf("%c%c %c%c\n",a[0],a[1],a[2],a[3]);
}
return 0;
}