基础练习 十六进制转八进制
时间限制: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 #include #include #define MAXsize 100000 void savebin(char *b,char *ch,int index)//保存二进制01字串 { b[index]=ch[0]; b[++index]=ch[1]; b[++index]=ch[2]; b[++index]=ch[3]; } void hextobin(char *h,char *b)//十六进制转二进制 { char t[16][5]= { \"0000\ \"1000\ }; int i = 0; for(;h[i]!='\\0';i++) { switch(h[i]) { case '0':{savebin(b,t[0],i*4);break;} case '1':{savebin(b,t[1],i*4);break;} case '2':{savebin(b,t[2],i*4);break;} case '3':{savebin(b,t[3],i*4);break;} case '4':{savebin(b,t[4],i*4);break;} case '5':{savebin(b,t[5],i*4);break;} case '6':{savebin(b,t[6],i*4);break;} case '7':{savebin(b,t[7],i*4);break;} case '8':{savebin(b,t[8],i*4);break;} case '9':{savebin(b,t[9],i*4);break;} case 'A':{savebin(b,t[10],i*4);break;} case 'B':{savebin(b,t[11],i*4);break;} case 'C':{savebin(b,t[12],i*4);break;} case 'D':{savebin(b,t[13],i*4);break;} case 'E':{savebin(b,t[14],i*4);break;} case 'F':{savebin(b,t[15],i*4);break;} } } b[4*i] = '\\0'; } void bintooct(char *b,char *o) { int i,j; int bl,ol; //确定八进制数的长度 bl = strlen(b); ol = ceil(bl / 3.0); //将二进制从高位向低位转换,逆序保存 j = bl - 1; i = ol - 1; for(; i >= 0; --i, j -= 3) { if(i > 0) { o[i]=b[j]+(b[j-1]-48)*2+(b[j-2]-48)*4; //权位值从低到高为:1 2 4 } else { switch(j) { case 0:{o[i]=b[j];break;}//说明只有一位二进制数 case 1:{o[i]=b[j]+(b[j-1]-48)*2;break;}//说明还有两位二进制数 case 2:{o[i]=b[j]+(b[j-1]-48)*2+(b[j-2]-48)*4;break;}//说明还有三位二进制数 } } } o[ol] = '\\0'; } void print(char *o)//打印八进制 { int i = 0; while(o[i]=='0')//排除首位为‘0’的情况{ ++i; } printf(\"%s\\n\ } int main() { char h[MAXsize]; //建立十六进制数组,长度为10万 char b[MAXsize*4+1]; //建立二进制数组,长度为4倍十六进制长度 char o[MAXsize*4/3+1]; int i,n; scanf(\"%d\ getchar(); for(i=0;i gets(h); hextobin(h,b); bintooct(b,o); print(o); //建立八进制数组 } return 0; } JAVA程序: import java.util.ArrayList; import java.util.List; import java.util.Scanner; public class B5 { public static void main(String[] args) { int n,m;char x; String[]s={\"0000\001\ StringBuffer sb; String ss,zero=\"0000\"; char a[]=new char[400002]; List Scanner sc=new Scanner(System.in); n=sc.nextInt(); for(int i=0;i long time1 = System.currentTimeMillis(); sb=new StringBuffer();num=new ArrayList for(int j=0;j m=Integer.parseInt(String.valueOf(x),16); sb.append(s[m]); } m=sb.length()%3; sb.insert(0,zero.subSequence(0, 3-m)); a=sb.toString().toCharArray(); for(int j=0,k=0;j m=0; for(int j=0;j else System.out.print(num.get(j)); } System.out.println(); long time2 = System.currentTimeMillis(); System.out.println(time2-time1); } } } 因篇幅问题不能全部显示,请点此查看更多更全内容