蓝桥杯-十六进制转八进制
2016-03-07 09:05
239 查看
基础练习 十六进制转八进制
时间限制:1.0s 内存限制:512.0MB
问题描述
给定n个十六进制正整数,输出它们对应的八进制数。
输入格式
输入的第一行为一个正整数n (1<=n<=10)。
接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
输出格式
输出n行,每行为输入对应的八进制正整数。
【注意】
输入的十六进制数不会有前导0,比如012A。
输出的八进制数也不能有前导0。
样例输入
2
39
123ABC
样例输出
71
4435274
【提示】
先将十六进制数转换成某进制数,再由某进制数转换成八进制。
第二种解法:
时间限制: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; }
相关文章推荐
- java中的移位操作
- sql 跨域
- 自我介绍(作业)
- 使用Retrofit 在代码混淆后 提示 Last parameter must be of type Callback or Callback
- Zend Framework教程之前端控制器Zend_Controller_Front用法详解
- 简单的百度定位
- transaction.addToBackStack(null);无效问题
- gh60 刷固件
- Android之AIDL服务
- shell编程(二):文件操作
- 数据结构(18)--Prim算法求解无向网的最小生成树
- Codeforces Round #340 (Div. 2)C. Watering Flowers(暴力)
- Oracle中"行转列"的实现方式
- SQL常用语句
- 802.15.4中文版
- 学习MySQL基本操作比较好的文章
- jQuery之前端国际化jQuery.i18n.properties
- Yii2中自带分页类实现分页
- hihocoder-建造基地(完全背包)
- EVC编程与调试过程出现的问题