蓝桥杯练习——进制转换
问题描述
给定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; }