uva 128
2014-11-25 21:22
337 查看
题意:给出一个字符串,把每一个字符对应ascii码的值,每个字符就是一个256进制的数,将这个字符串末尾再添加两个数要刚好整除n = 34943,要求输出这两个数的16进制形式。
题解:先利用 (a+b)mod n =( ( a mod n ) + (b mod n) ) mod n 和 (a * b) mod n =( ( a mod n ) * (b mod n) ) mod n 可以把字符串的值求出,然后再扩大256*256倍,因为最后添加两个数,相当于之前的值扩大256^2倍再加这两个未知数,根据(sum * 256 * 256 + x) mod n = 0,那么 x = n - (sum mod n)。
题解:先利用 (a+b)mod n =( ( a mod n ) + (b mod n) ) mod n 和 (a * b) mod n =( ( a mod n ) * (b mod n) ) mod n 可以把字符串的值求出,然后再扩大256*256倍,因为最后添加两个数,相当于之前的值扩大256^2倍再加这两个未知数,根据(sum * 256 * 256 + x) mod n = 0,那么 x = n - (sum mod n)。
#include <stdio.h> #include <string.h> #include <math.h> using namespace std; const int N = 1500; char s ; const char flag[] = {"0123456789ABCDEF"}; int main() { while (gets(s) && s[0] != '#') { int len = strlen(s); if (len == 0) { printf("00 00\n"); continue; } long long sum = 0; int n = 34943; for (int i = 0; i < len; i++) sum = (((sum % n) * 256) % n + s[i]) % n; int res = n - (sum * 256 * 256) % n; int ans[4]; for (int i = 0; i < 4; i++) { ans[3 - i] = flag[res % 16]; res /= 16; } for (int i = 0; i < 4; i++) { printf("%c", ans[i]); if (i == 1) printf(" "); } printf("\n"); } }
相关文章推荐
- UVa 128 Software CRC
- UVA 128 - Software CRC
- UVa 128 Software CRC / 进制转换
- UVa 128 Software CRC(模运算)
- UVA - 128 Software CRC
- uva 128 Software CRC
- UVa 128 - Software CRC
- UVA 128 Software CRC
- UVA - 128 Software CRC 256进制
- UVA 128 Software CRC(数论 进制转化)
- UVA128- Software CRC
- UVA 128 Software CRC
- uva 128 - Software CRC(进制转换)
- Software CRC - UVa 128 取模
- uva 128 Software CRC(进制转换)
- UVa 128 Software CRC 数论(模运算)
- uva128 - 软件CRC
- UVA - 128 Software CRC
- uva 128 - Software CRC
- UVa 128 Software CRC (模计算&CRC循环冗余校验码)