题目描述
小明获得了一些密码的片段,包含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
思路:模拟即可,用gets直接获取一行的所有数据,然后分开存放。
AC代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
int main()
{
char ch[100];
while(gets(ch)!=NULL)
{
int m=strlen(ch);
int a[m];
int i,k=1,n=0,j,flag=0,ans=0,max=0;//进制肯定要比每一位都大。
for(i=0;i<m;i++)//字符串部分
{
if(ch[i]==' ')
{
break;
}
if(ch[i]>='0'&&ch[i]<='9')
{
a[ans++]=ch[i]-'0';
}
else
{
a[ans++]=ch[i]-'A'+10;//字母变成数字
}
max=fmax(a[i],max);//找最大的数
}
for(i=m-1;i>=0;i--)//整数部分
{
if(ch[i]==' ')
{
break;
}
n+=(ch[i]-'0')*k;
k*=10;
}
for(i=max+1;i<=16;i++)//进制肯定要比每一位都大
{
int t=0,f=0;
for(j=ans-1;j>=0;j--)
{
t+=a[j]*pow(i,f);
f++;
}
if(t==n)//找到
{
flag=1;
break;
}
else if(t>n)//没找到
{
break;
}
else if(t<=0)//防止数据溢出
{
break;
}
}
if(flag==1)
{
printf("%d\n",i);
}
else
{
printf("Impossible\n");
}
}
return 0;
}