题解 | #进制转换#
进制转换
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;
}