您的位置:首页 > 其它

UVA128 - Software CRC(大数取模)

2014-11-12 11:03 267 查看
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]);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: