uva 128 Software CRC
数学题(模运算)
题意:详细的翻译http://www.cnblogs.com/devymex/archive/2010/08/28/1810480.html
简单的题意:给你一个字符串(可能有空格,最多1024字符),每个字符代表一个数字,因为最多有256个字符,所以这个字符串其实是表示一个256进制的数字。但这还没完,在这个256进制数字要再加两位,组成一个新的256进制数字,这个数字要能被g=34943(这是个十进制数字)整除,要你输出新添加的那两个数字是什么,这两个数字要以16进制的形式输出,用空格隔开
思路:把原来的256进制数字先转为十进制数x,那么再添加两位后,其实原本的数字翻了2倍,即翻了 *256*256=65536,所以x=x*65536。把新添加的两位数转化为十进制y
那么新的数字其实是x+y,我们的目的就是(x+y)%g=0; 根据模运算的性质可转化为 (x+y)%g=(x%g+y%g)%g=0; 我们要知道的是y,y=(g-x%g)%g,再把y转为16进制即可
#include <cstdio> #include <cstring> #define N 1030 #define g 34943 char num[N],*c="0123456789ABCDEF"; int main() { while(gets(num) && num[0]!='#') { long long t=0,ans; for(int i=0; num[i]; i++) t=(t*256+num[i])%g; t=(((t*256+0)%g)*256+0)%g; //可以一步写为 //t=(t*65536)%g; ans=(g-t)%g; int a[5]; for(int i=0; i<4; i++) { a[i]=ans%16; ans/=16; } printf("%c%c %c%c\n",c[a[3]],c[a[2]],c[a[1]],c[a[0]]); } return 0; }