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

 

posted @ 2013-01-19 20:00  Titanium  阅读(272)  评论(0编辑  收藏  举报