PTA 7-286 输入一个字符串转换成十进制整数

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
注: 无非每次循环乘以进制后再加上该位数字

归属知识点:
选择结构
函数

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值