问题描述
给定n个十六进制正整数,输出它们对应的八进制数。
输入格式
输入的第一行为一个正整数n (1<=n<=10)。
接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
输出格式
输出n行,每行为输入对应的八进制正整数。
【注意】
输入的十六进制数不会有前导0,比如012A。
输出的八进制数也不能有前导0。
样例输入
2
39
123ABC
样例输出
71
4435274
【提示】
先将十六进制数转换成二进制数,再由二进制数转换成八进制。
由于这题要求的十六进制字符很长,最长有100000,开始我的思路是16进制转换为10进制,但是考虑到这一点,即使是long long 的十进制数也存不下,我转换了下思路,想到了曾经的数字逻辑里面经常有三位二进制数转换为八进制,而二进制是最好表示的,如四位二进制数即可表示‘0’~‘F'的十六进制数,所以有了下面的代码
#include<bits/stdc++.h>
#include<algorithm>
#include<string>
using namespace std;
int main()
{
int i,n;
string s1,s2;//s1为输入的16进制字符串,s2为转换的2进制字符串,三位2进制为一个八进制
cin>>n;
while(n--)
{
cin>>s1;
s2="";//初始化
for(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)//三个一位的二进制串为八进制,确保长度为3的倍数,在前面补零
s2="00"+s2;
else if(len%3==2)
s2="0"+s2;
int flag=0;
for(i=0;i<=s2.size()-3;i+=3)
{
int num=4*(s2[i]-'0')+2*(s2[i+1]-'0')+s2[i+2]-'0';
if(num)
flag=1;//忽略前导零
if(flag)
cout<<num;
}
cout<<endl;
}
}
2.十六进制转十进制
资源限制
时间限制:1.0s 内存限制:512.0MB
问题描述
从键盘输入一个不超过8位的正的十六进制数字符串,将它转换为正的十进制数后输出。
注:十六进制数中的10~15分别用大写的英文字母A、B、C、D、E、F表示。
注:十六进制数中的10~15分别用大写的英文字母A、B、C、D、E、F表示。
样例输入
FFFF
样例输出
65535
#include<stdio.h>
#include<string.h>
#include<math.h>
int main()
{
char a[8];
int i;
scanf("%s",a);
int l=strlen(a);//计算字符串长度
long long ans=0;//注意是不超过8位的正的十六进制数字符串,因此数较大,应设为long long
for(i=0; i<l; i++)
{
if(a[i]>='0'&&a[i]<='9')
ans+=(a[i]-'0')*pow(16,l-1-i);
else
ans+=(a[i]-'A'+10)*pow(16,l-1-i);
}
printf("%lld\n",ans);
return 0;
}
还有一段错误代码
#include <stdio.h>
#include <string.h>
int main()
{
char s[10];
scanf("%s",s);
long long sum=0;
int k=1;
for(int i=strlen(s)-1;i>=0;i--)
{
if(s[i]>='0'&&s[i]<='9')
sum+=k*(s[i]-'0'),k*=16;
else sum+=k*(s[i]-'A'+10),k*=16;
}
printf("%lld",sum);
return 0;
} 当然最简单的是下面的 #include<bits/stdc++.h>
using namespace std;
int main(){
int n;
scanf("%x",&n);
printf("%u",n);
return 0;
}

京公网安备 11010502036488号