文章目录
想想自己都大二了,今天的进制转换,也是想了许久才搞出来 - -# 太差!!!
16 ->10
我只考虑到整数、、、 还有就是,感觉写麻烦了、、、
基本思路,就是将十六进制转成二进制,一位变成四位,再转为八进制,三位变成一位。
#include <stdio.h> #include <iostream> #include <algorithm> #include <string.h> #include <math.h> #include <queue> #include <vector> #include <map> using namespace std; #define N 100010 int tt[N*2]; char s[N]; char ss[N*4]; int main() { int n; while(~scanf("%d",&n)) { while(n --) { scanf("%s",s); // 输入 十六进制的字符串 int len = strlen(s); int tmp_1; int len1 = 0; int len2 = 0; int cc = 1; memset(ss, '0' ,sizeof(ss)); for(int i = len - 1; i >= 0; i --) { if(s[i] <= '9' && s[i] >= '0') tmp_1 = s[i] - '0'; else tmp_1 = s[i] - 'A' + 10; while(tmp_1) // 把十六进制转换成二进制 { ss[len1 ++] = tmp_1%2 + '0'; tmp_1 /= 2; } len1 = 4 * (cc ++); // 如果不能补成四位的二进制,补全0 } /************************ for(int i = 0; i < len1; i ++) { printf("%c",ss[i]); } printf("\n"); ************************/ for(int t = 0; t < len1 ; t += 3) { tt[len2 ++] = (ss[t + 2] - '0')*4 + (ss[t + 1] - '0')*2 + (ss[t] - '0'); } bool flag = false; for(int i = len2 - 1; i >= 0; i --) { if(flag) // 考虑到前导0,感觉我写麻烦了、、 { printf("%d",tt[i]); continue; } if(tt[i] != 0) { flag = true; printf("%d",tt[i]); } } printf("\n"); } } }
16 -> 10
其实任意进制转换成十进制,都是比较简单的,直接把各位数字与它的权值相乘,再累加即可,这里给出十六进制转成十进制
#include <stdio.h> #include <iostream> #include <algorithm> #include <string.h> #include <math.h> using namespace std; #define N 10 char s[N]; int main() { while(~scanf("%s",s)) { int len = strlen(s); int tmp_1; __int64 ans = 0; for(int i = 0; i < len; i ++) { if(s[i] <= '9' && s[i] >= '0') tmp_1 = s[i] - '0'; else tmp_1 = s[i] - 'A' + 10; ans += tmp_1 *pow(16, len - i - 1); } printf("%I64d\n", ans); } }