BNUZ-18-IT节 K题 骚年,你想见识真正的AK吗

题目链接: 点击打开链接
骚年,汝可知”AK”之力乎。
所谓AK就是all kill的意思,也就是在比赛结束前就将所有题目全都解出,而在茫茫人海的ACM赛场上总有队伍寻找着AK的的方法,但这往往都是不可能的。而二十二进制,是第二个恰好能表达AK的进制。这个进制将带领你走向AK。
在走向AK的道路上,它给出了一个二十二进制的数字a,希望你能找到一个大于等于a的最小的二十二进制数b,它能且能被7整除,因为7是个幸运数字,它将带给你好运。
只有寻找到二十二进制数b,你才可以见识到真正的AK,加油吧,骚年!
 
注意,在二十二进制下:
A可以转化为十进制10
B可以转化为十进制11
……
K可以转化为十进制20
L可以转化成十进制21

输入要求

每次先输入一个整数T(1 <= T <= 100),接下来T组测试数据
接下来每组数据输入一个二十二进制数a (0 <= a <= 22^100000)
保证这个二十二进制数只有大写字母[A-L]和数字[0-9]
 

输出要求

每对于每组数据第一行输出格式为"Case #i:",表示第i组测试数据
第二行输出为题目要求找到的这个二十二进制数(所有字母用大写表示)
 

测试数据

输入示例
2
AC
AK
 
输出示例
Case #1:
AI
Case #2:
B3
 

小贴士

对于第一组样例,AC的十进制为232,下一个能被7整除的十进制数为238,它所表示的二十二进制数为AI


题解:n进制转换成10进制后 模一个数 如果 为 1,n进制能否整除这个数 等于 这个n进制每个位上的数都转换为10进制的后数相加的结果除这个数。 之后就是大数加法 。 出题学长:小学数学时学过 21能被3整除 可以 等价于 2+1=3 能否被3整除, 然而我们队现场真的没有想到。ps:别用map,会tle,我再也不敢蛇皮操作了 orz

AC代码

#include <iostream>
#include <map>
#include <string>
#include <cstdio>

using namespace std;

char nm[] = "0123456789ABCDEFGHIJKL";

int change(char c) {
	if (c >= '0' && c <= '9') {
		return c - '0';
	}
	return c - 'A' + 10;
}

int yuu(string a) { //求余
	int sum = 0;
	for (int i = 0; a[i] != '\0'; i++) {
		sum += change(a[i]);
	}
	return sum % 7;
}

void _plus(string a, int yu) {
	int t[a.size()];
	for (int i = a.size()-1; i >= 0; i--) {
		t[i] = change(a[i]);
	}
	t[a.size()-1] += yu;
	for (int i = a.size()-1; i >= 0; i--) {
		if (t[i] >= 22) {
			a[i] = nm[t[i] % 22];
			if (i != 0)
				t[i-1]++;
			else
				a = "1" + a;
		} else {
			a[i] = nm[t[i]];
		}
	}
}

int main() {
	int t;
	string a;
	cin >> t;
	int cas = 0;
	while (t--) {
		cas++;
		cin >> a;
		int yu = yuu(a);
		string ans;
		if (yu == 0) {
			ans = a;
		} else
			ans = _plus(a, 7-yu);
		printf("Case #%d:\n", cas);
		cout << ans << endl;
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值