uva 128 - Software CRC(进制转换)

942 篇文章 2 订阅
109 篇文章 2 订阅

题目链接:uva 128 - Software CRC


题目大意:给出一个字符串,表示一个256进制的数(因为char类型表示的字符范围),现在要再这个256进制的数后面加两位数值,使得新的数可以被十进制数g = 34943整除,输出添加两位数的16进制。


解题思路:在原先的数的基础上加两位,比如加的两位数为x, 原先的数为y,那么新组成的数就为(y * 256 * 256 + x),而这个数要被g整除。所以我的做法是将num(256进制数)转换成10进制的num数,并且在转化的同时用num去对g进行求mod操作,剩下的余数t ,t * 256 *256就可以代表y* 256 * 256,然后用t对g做mod操作,就可以知道y需要再加上多少可以被整除。


#include <stdio.h>
#include <string.h>
const int N = 1030;
const int g = 34943;
const int tmp = 256;

int main() {
	char num[N], c[] = "0123456789ABCDEF";
	int sign[4];
	while (gets(num) && num[0] != '#') {
		long long ans, t = 0;
		for (int i = 0; num[i]; i++)
			t = (t * tmp + num[i]) % g;
		t = (t * tmp * tmp) % g;
		ans = (g - t) % g;
		for (int i = 0; i < 4; i++) {
			sign[i] = ans % 16;
			ans = ans / 16;
		}
		printf("%c%c %c%c\n", c[sign[3]], c[sign[2]], c[sign[1]], c[sign[0]]);
	}
	return 0;
}

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值