题目
问题描述
从键盘输入一个不超过8位的正的十六进制数字符串,将它转换为正的十进制数后输出。
注:十六进制数中的10~15分别用大写的英文字母A、B、C、D、E、F表示。
时间限制:1.0s 内存限制:512.0MB
正确代码
注意:8位的正的十六进制数,最大值为2的32次方-1;而int的最大值是2的31次方-1!范围小了
而unsigned int 的范围刚刚好
#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
int main(){
char t,ch[8];
int i,s[8],len;
unsigned int num = 0; //想一想为什么这里不用int型呢?
cin>>ch;
len = strlen(ch);
for(i = 0; i < len; i++){
switch(ch[i]){
case 'A':s[i] = 10;break;
case 'B':s[i] = 11;break;
case 'C':s[i] = 12;break;
case 'D':s[i] = 13;break;
case 'E':s[i] = 14;break;
case 'F':s[i] = 15;break;
default:s[i] = ch[i]-'0';
}
}
int j = 0;
while(j < i){
num *= 16;
num += s[j++];
}
cout<<num;
return 0;
}
result:
问题代码(?)
(我很痛苦,我觉得这个代码应该很精简了,为什么就是超时呢?
后来经过一次又一次尝试,发现读取字符串使用getchar,就超时;
然后改成cin,就没毛病了,蛋疼,此疑问暂留于此)
#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
int main(){
char t;
int i = 0,s[8];
unsigned int num = 0;
while((t = getchar()) != '\n'){
switch(t){
case 'A':s[i] = 10;break;
case 'B':s[i] = 11;break;
case 'C':s[i] = 12;break;
case 'D':s[i] = 13;break;
case 'E':s[i] = 14;break;
case 'F':s[i] = 15;break;
default:s[i] = t-'0';
}
i++;
}
int j = 0;
while(j < i){
num *= 16;
num += s[j++];
}
cout<<num;
return 0;
}