20个点差7个,听说应该用二分?还没学到

#include <iostream>
#include<cstdio>
#include<algorithm>
#include<string.h>
#include<string>
#include<stack>
#include<cmath>
#include<map>
using namespace std;
#pragma warning(disable:4996)
//11:05
//整体思路:将tag号数(radix)转成十进制,在遍历进制,看看是否在某进制下转成十进制时两个十进制的数相等
char n1_max = '1', n2_max = '1';//应当注意,进制数必须大于数字串中的每一位数
map<char, int> mp;//建立0~9、a~z对应的0~35(十进制)
long long int todecimal(char str[15], int r) {//将一串数转为十进制
	long long int ans = 0;
	for (unsigned int i = 0; i < strlen(str); i++) {
		ans = ans * r + mp[str[i]];
	}
	return ans;
}
int isequal(char str[15], long long int goal, char maxc) {//判断一串数是否在某进制下转成十进制时,与目标十进制数相等
	int i;
	for (i = mp[maxc]; i < 37; i++) {
		//遍历进制,必须从数字串中最大的字符所代表数+1的进制开始
		//比如数字串中有6,那至少是7进制
		if (todecimal(str, i) == goal)
			return i;
	}
	return -1;//-1表示找到36进制还未出现符合的
}
int main() {
	int tag, radix, i;
	char n1[15], n2[15], c;
	for (c = '0', i = 0; c <= '9'; c++, i++)
		mp.insert(make_pair(c, i));//初始化'0'~'9'对应的数字0~9
	for (c = 'a', i = 10; c <= 'z'; c++, i++)
		mp.insert(make_pair(c, i));//初始化'a'~'z'对应的数字10~35
	scanf("%s %s %d %d", n1, n2, &tag, &radix);
	for (i = 0; i < strlen(n1); i++)//找出n1中出现过的最大的字符
		if (n1[i] > n1_max)
			n1_max = n1[i];
	for (i = 0; i < strlen(n2); i++)//找出n2中出现过的最大的字符
		if (n2[i] > n2_max)
			n2_max = n2[i];
	if (tag == 1) {//tag=1,如果n1中出现比给出的radix还大的字符,直接impossible
		if (mp[n1_max] > radix) {
			printf("Impossible\n");
			return 0;
		}
	}
	else {//tag=2,如果n2中出现比给出的radix还大的字符,直接impossible
		if (mp[n2_max] > radix) {
			printf("Impossible\n");
			return 0;
		}
	}
	//测试转十进制函数todecimal是否正确
	//if (tag == 1)
	//	printf("n1 in decimal:%lld\n", todecimal(n1,radix));
	//else
	//	printf("n2 in decimal:%lld\n", todecimal(n2,radix));
	long long int goal = (tag == 1) ? todecimal(n1, radix) : todecimal(n2, radix);//十进制目标
	int ans = (tag == 1) ? isequal(n2, goal, n2_max + 1) : isequal(n1, goal, n1_max + 1);//寻找合适的进制
	if (ans == -1)//未找到合适的进制
		printf("Impossible\n");
	else
		printf("%d\n", ans);
	return 0;
}

猜你喜欢

转载自blog.csdn.net/ur_ytii/article/details/112926971
今日推荐