600字范文,内容丰富有趣,生活中的好帮手!
600字范文 > 16进制转8进制 两种方法先转二进制在转8进制或先转10进制在转8进制

16进制转8进制 两种方法先转二进制在转8进制或先转10进制在转8进制

时间:2018-12-02 07:02:22

相关推荐

16进制转8进制 两种方法先转二进制在转8进制或先转10进制在转8进制

问题描述 给定n个十六进制正整数,输出它们对应的八进制数。

输入格式 输入的第一行为一个正整数n (1<=n<=10)。

接下来n行,每行一个由09、大写字母AF组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。

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

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

样例输入 2 39 123ABC

样例输出 71 4435274

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

先转二进制在转8进制

#include<iostream>#include<cstring>using namespace std;int main(){string hex[10];//表示16进制数string bin[10];//表示2进制数string oct[10];//表示8进制数int n;cin>>n;for(int i=0;i<n;i++){cin>>hex[i];//输入几个16进制数}//16进制转2进制for(int i=0;i<n;i++)//遍历每一个16进制数{for(int j=0;j<hex[i].length();j++) //便利每一个16进制数的每一位{switch(hex[i][j]) //将每一位16进制转换成二进制{//将从0-F的所有的16进制对应的二进制的转换case '0':bin[i] += "0000";break;case '1':bin[i] += "0001";break;case '2':bin[i] += "0010";break;case '3':bin[i] += "0011";break;case '4':bin[i] += "0100";break;case '5':bin[i] += "0101";break;case '6':bin[i] += "0110";break;case '7':bin[i] += "0111";break;case '8':bin[i] += "1000";break;case '9':bin[i] += "1001";break;case 'A':bin[i] += "1010";break;case 'B':bin[i] += "1011";break;case 'C':bin[i] += "1100";break;case 'D':bin[i] += "1101";break;case 'E':bin[i] += "1110";break;case 'F':bin[i] += "1111";break;default :break;}}}//2进制转8进制for(int i=0;i<n;i++){int len = bin[i].length(); //每一位转成二进制后的数的长度int num = 0;//转成8进制后的值得大小int temp = 3;//8进制以3位二进制表示。for(int j=len-1;j>=0;j--)//从每一个转换后的二进制的最后以为开始便利{if(bin[i][j] == '1')//当二进制有1的时候每一位对应的值相加{switch(temp) //从转换后二进制数的每一位开始从右到左{case 3: num +=1;break;case 2: num +=2;break;case 1: num +=4;break;default:break;}}temp--; if(temp == 0) //判断当三位遍历完后将另外三位对应的值和对应的三位二进制的位数置为0{oct[i] += num + '0'; /*转换后的数值放入8进制的字符数组内并在后面接0为了让下一位的值能够对应上如39 对应的是 00 111 001 001对应的是1则 oct字符数组中放10 等下一组为 7时则为170*/num = 0;temp = 3;}}if(temp != 0){oct[i] += num + '0';}}//对8进制数逆序 for(int i=0;i<n;i++){char temp;int len = oct[i].length();for(int j=0;j<len/2;j++){temp = oct[i][j]; //将首尾互换 oct[i][j] = oct[i][len-1-j];oct[i][len-1-j] = temp;}}//输出数据for(int i=0;i<n;i++){int len = oct[i].length();int j=0;while(oct[i][j++] == '0'); //当首位为0的话往后走一位for(--j;j<len;j++)//从0开始遍历{cout<<oct[i][j];}cout<<endl; //换行}return 0;}

先转10进制在转8进制

#include<stdio.h>#include<stdlib.h>#include<math.h>#include<string.h>long long change(char );int convert(long long n) {long long temp;if(n==0){return 0;}else{temp=n%8; //入栈 6 2 2n=n/8;//18 2 0convert(n); //出栈 2 2 6 递归printf("%lld",temp);}return 0;}int main(){char a[10];long long i,n,sum=0,temp;scanf("%s",a);n = strlen(a);for(i=0;i<n;i++){temp=change(a[i]);sum=sum+temp*pow(16,n-1-i); //先输入的是最高位,即a[0]是高位,a[n-1]是低位}convert(sum);}long long change(char x){switch(x){case '0':return 0;case '1':return 1;case '2':return 2;case '3':return 3;case '4':return 4;case '5':return 5;case '6':return 6;case '7':return 7;case '8':return 8;case '9':return 9;case 'A':return 10;case 'B':return 11;case 'C':return 12;case 'D':return 13;case 'E':return 14;case 'F':return 15;}}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。