输入一个字符串,它可能是2–16进制数中一种进制数的表示,计算它对应的10进制数可能的最小值。例如,“151”可以是6–16进制中任何一种进制数的表示。 对应的10进制数可能的最小值就是67,也就是把它当成6进制。
输入格式:
输入一行字符串,仅由‘0’–‘9’和‘A’–'F’这些字符组成,保证转换后对应的10进制数在int范围内。
输出格式:
输出一个整数,为字符串对应10进制数可能的最小值。
输入样例:
213
输出样例:
39
#include<stdio.h>
#include<string.h>
#define N 100000
int KToD(char str[], int k);
int main(void)
{
char str[N];
int i,n,k,d,t=0,m,min;
scanf("%s",str);
/*下面判断最低进制,例如123不可能为2或3进制*/
for(i=0; str[i]!='\0'; i++)
{
//因为含有字母,故分类讨论
if(isalpha(str[i]))
{
switch(str[i])
{
case 'A':
m=11;
break;
case 'B':
m=12;
break;
case 'C':
m=13;
break;
case 'D':
m=14;
break;
case 'E':
m=15;
break;
case 'F':
m=16;
break;
}
if(m>t)
t=m;
}
else
{
if((str[i]-'0'+1)>t)
t=str[i]-'0'+1;
}
}
//将min先赋为最小进制得到的值
min=KToD(str,t);
for(i=t+1; i<=16; i++)
{
d=KToD(str,i) ;
if(d<min)
min=d;
}
printf("%d",min);
return 0;
}
//进制转化函数
int KToD(char str[], int k)
{
int d=0,i;
for(i=0; str[i]!='\0'; i++)
{
if(isalpha(str[i]))
{
switch(str[i])
{
case 'A':
d=d*k+10;
break;
case 'B':
d=d*k+11;
break;
case 'C':
d=d*k+12;
break;
case 'D':
d=d*k+13;
break;
case 'E':
d=d*k+14;
break;
case 'F':
d=d*k+15;
break;
}
}
else
d=d*k+(str[i]-'0');//其中 (str[i]-'0')将字符转化为数字
}
return d;
}
以前心态:遇到进制转换都直接跳
现在心态:做完进制题后,我行了!!
任意进制转换还不会捏ԅ(¯﹃¯ԅ)
大佬们不但能ak,还代码简单,TQL
总结:
无非每次循环乘以进制后再加上该位数字