题解 | #进制转换#

进制转换

http://www.nowcoder.com/practice/8f3df50d2b9043208c5eed283d1d4da6

c语言选手,个人建议不要用系统自带的转换,这样解题完全没有意思。
分享一下思路,用一个长度为4的字符数组存输入数据,然后判断有效性。
数据有效则从尾端开始计算数值(不要从左往右看,这是人的习惯思维,正常数数字要从右往做数,个十百千万...)
然后就是拿到数对应个十百千万,乘16^n,n的规则,个位数为0,十位数为1,百位数为2.....

注,使用编译器的自动转换,可以5行完成,但是可以选择随便输入一个字符,g,j,k等,看看有什么惊喜。

#include "stdio.h"
#include "string.h"
#include "math.h"
int system_trans(char * ch_num,int ch_len)
{
    if(memcmp(ch_num,"0x",2)!=0 || memcmp(ch_num,"0X",2)!=0)
    {
        //printf("input error!");
        return 0;
    }    
    int res = 0;
    for(int i = ch_len;i > 1;i--)
    {
        if(ch_num[i>= 'A' && ch_num[i<= 'F'){
            res += (ch_num[i]-'A'+10)*pow(16,ch_len-i);
        }
        else if(ch_num[i>= 'a' && ch_num[i<= 'f'){
            res += (ch_num[i]-'A'+10)*pow(16,ch_len-i);
        }
        else if(ch_num[i>= '0' && ch_num[i<= '9'){
            res += (ch_num[i]-'0')*pow(16,ch_len-i);
        }
        else
        {
            //printf("input error!");
        }
    }
    return res;
}

int main(void)
{
    char ch_num[4= {0};
    while(gets(ch_num))
    {
        int res = system_trans(ch_num,strlen(ch_num)-1);//有效数据段是n-1
        printf("%d\n",res);
    }  
    return 0;
}
全部评论
else if(ch_num[i] >= 'a' && ch_num[i] <= 'f'){ res += (ch_num[i]-'A'+10)*pow(16,ch_len-i); } 这里是不是应该 chnumi - a +10 ?
1 回复 分享
发布于 2022-02-27 16:35
注意 || 改 &&
点赞 回复 分享
发布于 2022-03-23 22:36
题目要求输出字符串,不是整形
点赞 回复 分享
发布于 2022-07-11 22:18

相关推荐

09-27 14:42
已编辑
浙江大学 Java
未来未临:把浙大放大加粗就行
点赞 评论 收藏
分享
7 2 评论
分享
牛客网
牛客企业服务