#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;
}
20个点差7个,听说应该用二分?还没学到
猜你喜欢
转载自blog.csdn.net/ur_ytii/article/details/112926971
今日推荐
周排行