PTA 7-286 输入一个字符串转换成十进制整数
分数 25
作者 iwyou
单位 郑州轻工业大学
输入一个字符串,它可能是2–16进制数中一种进制数的表示,计算它对应的10进制数可能的最小值。例如,“151”可以是6–16进制中任何一种进制数的表示。
对应的10进制数可能的最小值就是67,也就是把它当成6进制。
输入格式:
输入一行字符串,仅由‘0’–‘9’和‘A’–'F’这些字符组成,保证转换后对应的10进制数在int范围内。
输出格式:
输出一个整数,为字符串对应10进制数可能的最小值。
输入样例:
213
输出样例:
39
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
#include<stdio.h>
#include<string.h>
#define N 100000
int exchange(char str[], int k){ //进制转化函数
int d = 0, i;
for(i = 0; str[i] != '\0'; i++){
if(isalpha(str[i])){ //isalpha(str[i]): 判断 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;
}
int main(void){
char str[N];
int i, d, t = 0, m, min;
scanf("%s",str);
//下面判断最低进制,例如123不可能为2或3进制
for(i = 0; str[i] != '\0'; i++){ //因为含有字母,故分类讨论
if(isalpha(str[i])){ //isalpha(str[i]): 判断 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 = exchange(str,t);
for(i = t+1; i <= 16; i++){
d = exchange(str,i) ;
if(d < min)
min = d;
}
printf("%d", min);
return 0;
}
解题思路:
step1:进制转换之间的关系
step2:判断可能的最低进制并分类
step3:将最小进制的值赋值给min
注: 无非每次循环乘以进制后再加上该位数字
归属知识点:
选择结构
函数