PAT A1010 Radix (25 puntos)

enlaces a los temas : https://pintia.cn/problem-sets/994805342720868352/problems/994805507225665536

题目描述
Dado un par de números enteros positivos, por ejemplo, 6 y 110, puede esta ecuación 6 = 110 ser verdad? La respuesta es sí, si 6 es un número decimal y el 110 es un número binario.

Ahora, para cualquier par de números enteros positivos N 1 y N 2, su tarea es encontrar la raíz de un número, mientras que del otro se da.

输入
Cada archivo de entrada contiene un caso de prueba. Cada caso ocupa una línea que contiene 4 números enteros positivos:

radix día N1 N2

Aquí N1 y N2 cada uno tiene no más de 10 dígitos. Un dígito es menor que su radix y se selecciona de entre el conjunto {0-9, az} donde 0-9 representan los números decimales 0-9, y az representan los números decimales 10-35. El último número radix es la radix de N1 si la etiqueta es 1, o de N2 si la etiqueta es de 2.

输出
Para cada caso de prueba, imprimir en una línea el radix de la otra número de modo que la ecuación N1 = N2 es cierto. Si la ecuación es imposible, imposible imprimir. Si la solución no es única, salida de la raíz más pequeña posible.

entrada de la muestra
6110110

Salida de muestra
2

código

#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;

typedef long long LL;
LL map[256];
LL inf = (1LL << 63) - 1;

void init() {
	for(char c = '0'; c <= '9'; c++)
		map[c] = c - '0';
	for(char c = 'a'; c <= 'z'; c++)
		map[c] = c - 'a' + 10;
}

LL convertNum10(char a[], LL radix, LL t) {
	LL ans = 0;
	int len = strlen(a);
	for(int i = 0; i < len; i++) {
		ans = ans * radix + map[a[i]];
		if(ans < 0 || ans > t)
			return -1;
	}
	return ans;
}

int cmp(char N2[], LL radix, LL t) {
	int len = strlen(N2);
	LL num = convertNum10(N2, radix, t);
	if(num < 0)
		return 1;
	if(t > num)
		return -1;
	else if(t == num)
		return 0;
	else 
		return 1;
}

LL binarySearch(char N2[], LL left, LL right, LL t) {
	LL mid;
	while(left <= right) {
		mid = (left + right) / 2;
		int flag = cmp(N2, mid, t);
		if(flag == 0) 
			return mid;
		else if(flag == -1)
			left = mid + 1;
		else
			right = mid - 1;
	}
	return -1;
}

int findLargestDigit(char N2[]) {
	int ans = -1, len = strlen(N2);
	for(int i = 0; i < len; i++) {
		if(map[N2[i]] > ans)
			ans = map[N2[i]];
	}
	return ans + 1;
}

char N1[20], N2[20], temp[20];
int tag, radix;
int main() {
	init();
	scanf("%s %s %d %d", N1, N2, &tag, &radix);
	if(tag == 2) {
		strcpy(temp, N1);
		strcpy(N1, N2);
		strcpy(N2, temp);
	}
	LL t = convertNum10(N1, radix, inf);
	LL low = findLargestDigit(N2);
	LL high = max(low, t) + 1;
	LL ans = binarySearch(N2, low, high, t);
	if(ans == -1)
		printf("Impossible\n");
	else
		printf("%lld\n", ans);
	return 0;
}

Publicados 288 artículos originales · ganado elogios 12 · Vistas a 20000 +

Supongo que te gusta

Origin blog.csdn.net/Rhao999/article/details/104830956
Recomendado
Clasificación