十六进制转十进制
问题描述
从键盘输入一个不超过8位的正的十六进制数字符串,将它转换为正的十进制数后输出。
注:十六进制数中的10~15分别用大写的英文字母A、B、C、D、E、F表示。
样例输入
FFFF
样例输出
65535
方法一:巧用C语言的输入输出格式符
#include"cstdio"
int main(){
__int64 n; //等价于 long long int n;
//unsigned int n;
scanf("%llx",&n); //注意格式符
printf("%lld\n",n); //llu==lld
return 0;
}
注意:
试了好多次,每次运行FFFFFFFF的时候都会溢出,后来无意中看到无符号整数(unsigned int,例如-1的无符号数(32位)应该位4294967295),运行结果正确。或者长整型(long long,不同的编译环境可能位数不同,通常为32位或64位)。
方法二:
#include"iostream"
#include"string"
using namespace std;
int main(){
string s;
cin>>s;
unsigned int t=0,n=1;//FFFFFFFF H=4294967295 D
int i=s.size()-1;
for(;i>=0;i--){
if(s[i]<='9')
t+=(s[i]-'0')*n;
else
t+=(s[i]-'A'+10)*n;
//cout<<t<<" ";
n*=16;
}
//cout<<endl;
cout<<t<<endl;
return 0;
}
十六进制转八进制
问题描述
给定n个十六进制正整数,输出它们对应的八进制数。
输入格式
输入的第一行为一个正整数n (1<=n<=10)。
接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
输出格式
输出n行,每行为输入对应的八进制正整数。
【注意】
输入的十六进制数不会有前导0,比如012A。
输出的八进制数也不能有前导0。
样例输入
2
39
123ABC
样例输出
71
4435274
【提示】
先将十六进制数转换成某进制数,再由某进制数转换成八进制。
方法一:巧用C语言的输入输出格式符
#include"cstdio"
int n; //试了很多次,想不通为什么n要声明为全局变量
int main(){
//int n; 在main内声明n时,循环不按照题目要求结束
scanf("%d",&n);
unsigned int t;
while(n!=0){
scanf("%llx",&t);
printf("%llo\n",t);
n--;
}
return 0;
}
方法二:借鉴(哈哈 一个好的程序猿是“搬运工”)
#include"iostream"
#include"string"
using namespace std;
int main(){
int n;
cin>>n;
string s1,s2;
while((n--)!=0){
cin>>s1;
s2="";
for(int i=0;i<s1.size();i++){
switch(s1[i]){
case '0':s2+="0000";break;
case '1':s2+="0001";break;
case '2':s2+="0010";break;
case '3':s2+="0011";break;
case '4':s2+="0100";break;
case '5':s2+="0101";break;
case '6':s2+="0110";break;
case '7':s2+="0111";break;
case '8':s2+="1000";break;
case '9':s2+="1001";break;
case 'A':s2+="1010";break;
case 'B':s2+="1011";break;
case 'C':s2+="1100";break;
case 'D':s2+="1101";break;
case 'E':s2+="1110";break;
case 'F':s2+="1111";break;
default :break;
}
}
int len=s2.size();
if(len%3==1)
s2="00"+s2;
if(len%3==2)
s2="0"+s2;
int flag=0;
for(int i=0;i<=s2.size()-3;i+=3){
int num=(s2[i]-'0')*4+(s2[i+1]-'0')*2+(s2[i+2]-'0');
if(num) //忽略前导0
flag=1;
if(flag)
cout<<num;
}
cout<<endl;
}
return 0;
}
小结:
十六进制转八进制的时候,提示“先将十六进制数转换成某进制数,再由某进制数转换成八进制。”但是因为题目要求十六进制数的长度不超过100000,如果用十进制做中间值会溢出,故我们采用二进制,我们可以利用C++的string类,要注意四位二进制表示一位十六进制,三位二进制表示一位八进制,故由二进制转八进制时要注意和3qu取余,修改二进制的长度
(if(len%3==1) s2="00"+s2; if(len%3==2)s2="0"+s2;)。严格遵守题目要求!!!