1010. Radix (25)

本文介绍了一个进制转换问题,即给定两个数和其中一个数的进制,如何找到另一个数的正确进制使得两个数相等。文章通过二分搜索算法高效地解决了这一问题,并详细解释了算法的实现细节。

1010. Radix (25)

时间限制
400 ms
内存限制
65536 kB
代码长度限制
16000 B
判题程序
Standard
作者
CHEN, Yue

Given a pair of positive integers, for example, 6 and 110, can this equation 6 = 110 be true? The answer is "yes", if 6 is a decimal number and 110 is a binary number.

Now for any pair of positive integers N1 and N2, your task is to find the radix of one number while that of the other is given.

Input Specification:

Each input file contains one test case. Each case occupies a line which contains 4 positive integers:
N1 N2 tag radix
Here N1 and N2 each has no more than 10 digits. A digit is less than its radix and is chosen from the set {0-9, a-z} where 0-9 represent the decimal numbers 0-9, and a-z represent the decimal numbers 10-35. The last number "radix" is the radix of N1 if "tag" is 1, or of N2 if "tag" is 2.

Output Specification:

For each test case, print in one line the radix of the other number so that the equation N1 = N2 is true. If the equation is impossible, print "Impossible". If the solution is not unique, output the smallest possible radix.

Sample Input 1:
6 110 1 10
Sample Output 1:
2
Sample Input 2:
1 ab 1 2
Sample Output 2:
Impossible

提交代

题意: 给定两个数, 其中一个数已经知道了它的进制表示, 求另一个数用何进制表示才能同其相同, 如果不能, 输出Impossible.

        首先给定一组数据 "zzzzzzzzzz ab 1 36" 如果普通模拟肯定超时, 所以我们采用二分答案的思想来做. 好了, 大体方向已经找到了, 那么二分的上下限呢, 下限我们可以很快求出, 就是这个数中最大的那个数+1, 可是上限呢?  我们可以求出这个数的长度n, 假设, 我们要以R进制表示, 且另外一个数是X, 则, 原来的数 < R + R^1 + R^2 + ...... R^n = (R^n - 1) / (R - 1),  则 (R^n - 1) / (R - 1) = X, R ^ n = (X * (R - 1) + 1), lg(X * (R - 1) + 1) / lg (R) = n,  我们粗略可以得出 (lgX / lgR) + 1 = n.至此, 上限就可以求出来啦.


#include <cstdio>
#include <cstring>
#include <cmath>

typedef long long LL;
const LL INF = 0x3f3f3f3f3f3f3f3f;

LL get_digit(char ch) {
	if (ch >= '0' && ch <= '9')
		return ch - '0';
	return ch - 'a' + 10;
}

LL find_x(char* str, LL radix) {
	int len = strlen(str);
	LL ans = get_digit(str[len - 1]);
	len = len - 2;
	LL tmp = radix;

	while (~len) {
		ans += get_digit(str[len]) * tmp;
		tmp *= radix;
		--len;
	}

	return ans;
}

LL search(char* str, LL a, LL R) {
	LL left = R, right;
	if (strlen(str) > 1)
		right = exp(log(a) / (strlen(str) - 1));
	else
		right = a + 1;

	while (left <= right) {
		LL mid = (left + right) / 2;
		LL tmp = find_x(str, mid);
		if (tmp == a)
			return mid;
		else if (tmp < a)
			left = mid + 1;
		else
			right = mid - 1;
	}

	return -1;
}

int main() {
	LL a, b, tag, radix;

	char stra[20], strb[20];
	scanf("%s%s%lld%lld", stra, strb, &tag, &radix);

	if (tag == 2) {
		char tmp[20];
		strcpy(tmp, stra);
		strcpy(stra, strb);
		strcpy(strb, tmp);
	}

	a = find_x(stra, radix);

	LL R = 2;
	for (int i = 0; strb[i]; ++i)
		if (R <= get_digit(strb[i]))
			R = get_digit(strb[i]) + 1;

	R = search(strb, a, R);

	if (R == -1)
		printf("Impossible");
	else
		printf("%lld", R);

	return 0;
}


### 关于1010 Radix测试点的技术含义及用途 对于特定标记为“1010 Radix”的测试点,在计算机科学领域内通常涉及的是基数(Radix)的概念,这主要关联到数据表示形式以及算法设计中的数制转换。然而,“1010”作为一个二进制字符串可以直接被解释为十进制下的数值10;当提到“1010 Radix”,可能是指基于不同进制间相互转化的一种测试案例。 #### 基数概念解析 在信息技术里,基数指的是某个计数系统的底数或基础。例如: - **二进制** (Binary): 使用0和1两个符号,其基数为2; - **八进制** (Octal): 使用0至7八个符号,基数为8; - **十进制** (Decimal): 日常生活中常用的数字系统,使用0到9十个符号,基数为10; - **十六进制** (Hexadecimal): 计算机编程中常用,除了0-9外还加入了A-F六个字母作为额外的记号,因此基数为16。 针对“1010 Radix”这一表述,如果将其视为一个特殊的测试场景,则可能是为了验证程序能否正确处理来自多种进制的数据输入,并确保这些数据能够在不同的基数之间准确无误地互相转换[^1]。 #### 实际应用场景举例 考虑如下Python代码片段用于展示如何实现简单的多进制间的转换功能: ```python def convert_base(number_str, from_radix=10, to_radix=10): """Convert a string representing an integer in one base to another.""" decimal_value = int(number_str, from_radix) result = '' while decimal_value > 0: remainder = decimal_value % to_radix if remainder >= 10: # Convert numbers above 9 into corresponding letters A-Z. char = chr(ord('A') + remainder - 10) else: char = str(remainder) result = char + result decimal_value //= to_radix return '0' if not result else result print(convert_base('1010', 2, 10)) # Output should be "10" ``` 此函数`convert_base()`可以接收三个参数:待转换的原始数值串、源基数(`from_radix`)以及目标基数(`to_radix`)。通过调用内置的`int()`函数先将给定的字符串按照指定的原生基数转成内部统一使用的十进制整型值,之后再依据目的基数逐步构建新的表达方式直至完成整个过程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值