首页 > 代码库 > UVA128 - Software CRC(大数取模)

UVA128 - Software CRC(大数取模)

UVA128 - Software CRC(大数取模)

题目链接

题目大意:给你一个字符串,这个字符串代表的是256进制的一个数,要求在这个字符串后面再加上两个两个字节,使得这个新的字符串的值取模于34943等于0.最后要求你输出这两个字节(十六进制)。

解题思路:256进制的数先转化成十进制的数m,然后求出还需要的数n使得(n + m)%34943 ==0 ,最后再将n转换成16进制的数输出就可以了。

代码:

#include <cstdio>
#include <cstring>

typedef long long ll;
const int maxn = 1<<10 + 5;
const int MOD = 34943;

char str[maxn];
char num[4];
int t[4];

void init () {

    t[0] = 1;
    for (int i = 1; i < 4; i++)
        t[i] = t[i - 1] * 16;
}

int solve () {

    int len = strlen(str);
    ll ans = 0;
    for (int i = 0; i < len; i++) 
        ans = (ans * 256 + (ll)str[i]) % MOD;

    ans = ((ans * 256) %MOD * 256) % MOD;
    return (MOD - (int)ans) % MOD; 
}

char change(int num) {

    if (num >= 0 && num <= 9)
        return num + ‘0‘;
    else 
        return ‘A‘ + num - 10;
}

void trans (int ans) {

    for (int i = 3; i >= 0; i--) {

        if (ans >= t[i]) {
            num[i] = change(ans / t[i]);
            ans = ans % t[i];
        } else 
            num[i] = ‘0‘;
    }
}

int main () {

    init();
    while(gets(str) != NULL) {
        if (str[0] == ‘#‘)
            break;

        trans(solve());    
        printf ("%c%c %c%c\n", num[3], num[2], num[1], num[0]);
    }
}

UVA128 - Software CRC(大数取模)