Description | ||
Digit String题目描述小明获得了一些密码的片段,包含0∼9,A∼F 这些字符,他猜这些是某个进制下的一个整数的数码串。 小明想知道从2到16进制中,哪些进制下,这个数码串的对应的十进制整数值,等于n? 输入存在不超过1000个样例,每行一个样例。 每行包括两部分,数码串(串长不超过31),整数n(1≤n≤109) 输出每行输出一个样例的结果。 如果存在多个解,输出最小的那个进制。 如果没有满足的进制,输出"Impossible"。 样例输入F 15 F 14 23 11 25 13 样例输出16 Impossible 4 Impossible |
用字符数组读入这个数码串,然后进行判断,如果他出现的字符都超过了该进制,那么肯定不可能是,如果可以是该进制,再判断其在该进制下的值是不是等于n
#include<stdio.h>
#include<string.h>
__int64 jz(int i,int len);
char s[32];
int main()
{
while(scanf("%s", &s)!=EOF){
int n;
scanf("%d", &n);
int len = strlen(s);
__int64 sum=0;
int i;
for(i=2;i<=16;i++){
int flag=1;
for(int j=0;j<len;j++){//判断字符串是否符合进制
int temp;
if(s[j]>='0'&&s[j]<='9'){
temp = s[j] - '0';
}
if(s[j]>='A'&&s[j]<='F'){
temp = s[j] - 'A' +10;
}
if(temp>=i){
flag=0;
break;
}
}
if(flag==0)continue;
sum = jz(i, len);
if(sum==n)break;
}
if(i<=16)printf("%d\n", i);
else printf("Impossible\n");
}
return 0;
}
__int64 jz(int i,int len)
{
__int64 sum = 0;
for(int j=0;j<len;j++){
int temp;
if(s[j]>='0'&&s[j]<='9'){
temp = s[j] - '0';
}
else if(s[j]>='A'&&s[j]<='F'){
temp = s[j] - 'A' +10;
}
sum = sum*i + temp;
}
return sum;
}