UVa OJ 128

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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值