蓝桥杯题库基础练习:进制转换
一、十六进制转十进制
问题描述
从键盘输入一个不超过8位的正的十六进制数字符串,将它转换为正的十进制数后输出。
注:十六进制数中的10~15分别用大写的英文字母A、B、C、D、E、F表示。
样例输入
FFFF
样例输出
65535
分析:按16进制展开;按数位依次操作,每次将前面的乘16,再加上当前数位的值。
C语言代码
#include<stdio.h> #include<string.h> #include<math.h> int main(){ char strHex[10]; //设定字符串长度 int i = 0, len = 0, temp = 0; long long answer = 0; gets(strHex); len = strlen(strHex); for (i = 0; strHex[i] != '\0'; ++i){ switch(strHex[i]){ case 'A': temp = 10; break; case 'B': temp = 11; break; case 'C': temp = 12; break; case 'D': temp = 13; break; case 'E': temp = 14; break; case 'F': temp = 15; break; default: temp = strHex[i]-'0'; break; } answer += (temp*pow(16,len-1-i)); //pow函数作用:计算x的 y次方 } printf("%lld",answer); return 0; }
C++代码
#include<iostream> #include<string> using namespace std; int main() { string s; while(cin>>s) { int leth=s.length(); long long sum=0; for(int i = 0;i < leth;i++) { if(s[i]>='A' && s[i]<='F') sum=sum*16 + s[i]-'A'+10; else sum=sum*16 + s[i]-'0'; } cout<<sum<<endl; } return 0; }
二、十六进制转八进制
问题描述
给定n个十六进制正整数,输出它们对应的八进制数。
输入格式
输入的第一行为一个正整数n (1<=n<=10)。
接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
输出格式
输出n行,每行为输入对应的八进制正整数。
注意
输入的十六进制数不会有前导0,比如012A。
输出的八进制数也不能有前导0。
样例输入
2
39
123ABC
样例输出
71
4435274
提示
先将十六进制数转换成某进制数,再由某进制数转换成八进制。
#include <stdio.h> #include <stdlib.h> #include <string.h> #define MaxSize 100000 void saveB(char *b,char c3,char c2,char c1,char c0,int start) { b[start]=c3; b[start+1]=c2; b[start+2]=c1; b[start+3]=c0; } int htob(char *h,char *b) { int i,j; int hl=strlen(h); for(i=0;i<hl;i++) switch(h[i]) { case '0': { saveB(b,'0','0','0','0',4*i); break; } case '1': { saveB(b,'0','0','0','1',4*i); break; } case '2': { saveB(b,'0','0','1','0',4*i); break; } case '3': { saveB(b,'0','0','1','1',4*i); break; } case '4': { saveB(b,'0','1','0','0',4*i); break; } case '5': { saveB(b,'0','1','0','1',4*i); break; } case '6': { saveB(b,'0','1','1','0',4*i); break; } case '7': { saveB(b,'0','1','1','1',4*i); break; } case '8': { saveB(b,'1','0','0','0',4*i); break; } case '9': { saveB(b,'1','0','0','1',4*i); break; } case 'A': { saveB(b,'1','0','1','0',4*i); break; } case 'B': { saveB(b,'1','0','1','1',4*i); break; } case 'C': { saveB(b,'1','1','0','0',4*i); break; } case 'D': { saveB(b,'1','1','0','1',4*i); break; } case 'E': { saveB(b,'1','1','1','0',4*i); break; } case 'F': { saveB(b,'1','1','1','1',4*i); break; } } return 4*hl; } int btoo(char *b,char *o,int bl) { int i,j; int ol; int value; if(bl%3==0) ol=bl/3; else ol=bl/3+1; j=bl-1; for(i=ol-1;i>=0;i--) { if(i>0) o[i]=b[j]-48+(b[j-1]-48)*2+(b[j-2]-48)*4+48; else { switch(j) { case 2: o[i]=b[j]-48+(b[j-1]-48)*2+(b[j-2]-48)*4+48; break; case 1: o[i]=b[j]-48+(b[j-1]-48)*2+48; break; case 0: o[i]=b[j]; break; } } j=j-3; } return ol; } void printO(char *o,int ol) { int i=0; if(o[0]=='0') i=1; for(;i<ol;i++) { printf("%c",o[i]); } printf("\n"); } main() { char h[MaxSize]; char b[4*MaxSize]; char o[4*MaxSize/3+1]; int n,i,bl,ol; scanf("%d",&n); getchar(); for(i=0;i<n;i++) { gets(h); bl=htob(h,b); ol=btoo(b,o,bl); printO(o,ol); } }
#include <iostream> #include <stdio.h> #include <string.h> #include <STDLIB.H> int GetI(char c) { return c>>4&1?c&15:(c&15)+9; } int main(int argc, char *argv[]) { char arr[200001] = {'\0'}; char brr[400001] = {'\0'}; int n = 0; int i = 0; scanf("%d",&n); for(i = 0;i < n;i++) { scanf("%s",arr); int m[3] = {1,16,256}; int len = strlen(arr); int j = len-1; int a,b,c; a = b = c = 0; int k = 0,l = 0; int count = 0; while(j>-1) { a += (arr[j]>>4&1?arr[j]&15:(arr[j]&15)+9)*m[k]; //个位 if(k==2||j==0) { while(a) { brr[l++] = ((a&7)|48); a = a>>3; count++; } while(j!=0&&count<4) { brr[l++] = '0'; count++; } count = 0; } k = (k+1)%3; j--; } strrev(brr); printf("%s\n",brr); memset(arr,'\0',(sizeof(char)*200001)); memset(brr,'\0',(sizeof(char)*400001)); } return 0; }
三、十进制转十六进制
问题描述
十六进制数是在程序设计时经常要使用到的一种整数的表示方式。它有0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F共16个符号,分别表示十进制数的0至15。十六进制的计数方法是满16进1,所以十进制数16在十六进制中是10,而十进制的17在十六进制中是11,以此类推,十进制的30在十六进制中是1E。
给出一个非负整数,将它表示成十六进制的形式。
输入格式
输入包含一个非负整数a,表示要转换的数。0<=a<=2147483647
输出格式
输出这个整数的16进制表示
样例输入
30
样例输出
1E
#include <stdio.h> #include <stdlib.h> char data[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'}; void Print(char *num,int n) { int i; for(i=n-1;i>=0;i--) printf("%c",num[i]); printf("\0"); printf("\n"); } //将十六进制数转换为十进制数 int Transform(char *num,long long value) { int n=0; while(value>=16) { num[n++]=data[value%16]; value/=16; } num[n++]=data[value%16]; return n; } int main() { long long value; char num[10]; int n; scanf("%I64d",&value); n=Transform(num,value); Print(num,n); return 0; }
版权声明:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明。
特此声明:所有评论和私信都会在第一时间回复。也欢迎园子里和园子外的大大们指正错误,共同进步。或者直接私信我 (^∀^)
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是作者坚持原创和持续写作的最大动力!
您的资助是我最大的动力!
金额随意,欢迎来赏!
如果,您希望更容易地发现我的新博客,不妨点击一下绿色通道的
本博客的所有打赏均将用于博主女朋友的化妆品购买以及养肥计划O(∩_∩)O。我是【~不会飞的章鱼~】!