蓝桥杯-十六进制转八进制

来源:互联网 发布:小米手机没有4g网络 编辑:程序博客网 时间:2024/05/29 02:00

  基础练习 十六进制转八进制  
时间限制:1.0s   内存限制:512.0MB
问题描述
  给定n个十六进制正整数,输出它们对应的八进制数。

输入格式
  输入的第一行为一个正整数n (1<=n<=10)。
  接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。

输出格式
  输出n行,每行为输入对应的八进制正整数。

  【注意
  输入的十六进制数不会有前导0,比如012A。
  输出的八进制数也不能有前导0。

样例输入
  2
  39
  123ABC

样例输出
  71
  4435274

  提示
  先将十六进制数转换成某进制数,再由某进制数转换成八进制。

#include<cstdio>#include<iostream>#include<cstring>#include<cmath>using namespace std;char s1[990000], s2[990000], s3[990000], s4[990000];string getT(char c) {string s;switch(c) {case '0': s = "0000";break;case '1': s = "0001";break;case '2': s = "0010";break;case '3': s = "0011";break;case '4': s = "0100";break;case '5': s = "0101";break;case '6': s = "0110";break;case '7': s = "0111";break;case '8': s = "1000";break;case '9': s = "1001";break;case 'A': s = "1010";break;case 'B': s = "1011";break;case 'C': s = "1100";break;case 'D': s = "1101";break;case 'E': s = "1110";break;case 'F': s = "1111";break;}return s;}char getE(char *a) {char s;if (a[0] == '0' && a[1] == '0' && a[2] == '0') s = '0';else if (a[0] == '0' && a[1] == '0' && a[2] == '1') s = '1';else if (a[0] == '0' && a[1] == '1' && a[2] == '0') s = '2';else if (a[0] == '0' && a[1] == '1' && a[2] == '1') s = '3';else if (a[0] == '1' && a[1] == '0' && a[2] == '0') s = '4';else if (a[0] == '1' && a[1] == '0' && a[2] == '1') s = '5';else if (a[0] == '1' && a[1] == '1' && a[2] == '0') s = '6';else if (a[0] == '1' && a[1] == '1' && a[2] == '1') s = '7';return s;}int getTwo(char *s1) {char ss[5];int k = 2;int len = strlen(s1);for (int i = 0; i < len; i++) {string n1 = getT(s1[i]);for (int j = k, x = 0; x < 4; j++,x++) {s2[j] = n1[x];}k += 4;}return k;}int main() {int n, len3, len4;scanf("%d", &n);while(n--) {scanf("%s", s1);len3 = 2, len4 = 0;int len5 = 0;int len = getTwo(s1);int index = 0;for (int i = 2; i < len; i++) {if (s2[i] != '0') {index = i;break;}}for (int i = index; i < len; i++) {len5++;s3[len3++] = s2[i];}int m = len5%3;int index1 = 3-m;if (index1 == 2) {s3[0] = '0';s3[1] = '0';index = 0;} else if (index1 == 1) {s3[1] = '0';index = 1;} else {index = 2;}for (int i = index; i < len3;) {char ss[3];ss[0] = s3[i];ss[1] = s3[i+1];ss[2] = s3[i+2];s3[len4++] = getE(ss);i += 3;}for (int i = 0; i < len4; i++) printf("%c", s3[i]);puts("");}return 0;}

第二种解法:


#include<cstdio>#include<math.h>#include<cstring>int temp[410000];char jz16[110000];int answer[410000];int switcha(char a){if(a>='0'&&a<='9')    return a-'0';else    return a-'A'+10;}int main(){int n;int len;int now;int i,j,k;int sum;scanf("%d",&n);while(n--){scanf("%s",jz16);len=strlen(jz16);for(i=0;i<len;i++){now=switcha(jz16[i]);for(j=(i+1)*4-1;j>=i*4;j--){temp[j]=now%2;now/=2;}}//一个十六进制变成4个二进制顺着来 memset(answer,0,sizeof(answer));for(i=len*4-1,sum=0;i>=0;i-=3,sum++)//三个二进制变成一个八进制逆着来     for(j=i,k=0;j>i-3&&j>=0;j--,k++)        answer[sum]+=temp[j]*(int)pow(2,k);for(i=sum;;i--)    if(answer[i]!=0)        break;//注意不输出前面多余的0 for(i=i;i>=0;i--)    printf("%d",answer[i]);printf("\n");}return 0;}


0 0
原创粉丝点击