十六进制数转八进制 大数转化
发布时间:2020-12-14 03:42:19 所属栏目:大数据 来源:网络整理
导读:题目: 问题描述 给定n个十六进制正整数,输出它们对应的八进制数。 输入格式 输入的第一行为一个正整数n (1=n=10)。 接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。 输出格式 输出n
题目:
问题描述
给定n个十六进制正整数,输出它们对应的八进制数。
输入格式
输入的第一行为一个正整数n (1<=n<=10)。
接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
输出格式
输出n行,每行为输入对应的八进制正整数。
注意
输入的十六进制数不会有前导0,比如012A。
输出的八进制数也不能有前导0。
样例输入
2
39 123ABC
样例输出
71
4435274 思路: 先转化为2进制,然后再转化为八进制。 数学上容易证明,2进制和十六进制的转化就是美4位取一为一组。 转化为8进制就是每3位取为一组。 由于4*n=n(mod3),所以要对length对3的余数进行讨论。 代码: #include<iostream> #include<vector> #include<string> using namespace std; int getDigit(char c) { if(c=='0') return 0; else if(c=='1') return 1; else if(c=='2') return 2; else if(c=='3') return 3; else if(c=='4') return 4; else if(c=='5') return 5; else if(c=='6') return 6; else if(c=='7') return 7; else if(c=='8') return 8; else if(c=='9') return 9; else if(c=='A') return 10; else if(c=='B') return 11; else if(c=='C') return 12; else if(c=='D') return 13; else if(c=='E') return 14; else if(c=='F') return 15; return -1; } int p[100000]; int q[400000]; int r[100000]; int g[3]={1,2,4}; int main() { int n; cin>>n; string s; while(n--) { cin>>s; int length=s.length(); { for(int i=0;i<length;i++) p[i]=getDigit(s[i]); for(int i=0;i<length;i++) { for(int j=3;j>=0;j--) { q[4*i+j]=p[i]%2; p[i]/=2; } } // for(int i=0;i<4*length;i++) // cout<<q[i]<<" "; // cout<<endl; // if(length%3==0) { bool flag=0; for(int i=0;i<4*length;i+=3) { int temp=0; for(int j=2;j>=0;j--) { temp+=g[j]*q[i+2-j]; } if(flag==0&&temp) { cout<<temp; flag=1; } else cout<<temp; } cout<<endl; } else if(length%3==1) { bool flag=0; if(q[0]) { cout<<q[0]; flag=1; } for(int i=1;i<4*length;i+=3) { int temp=0; for(int j=2;j>=0;j--) { temp+=g[j]*q[i+2-j]; } if(flag==0&&temp) { cout<<temp; flag=1; } else cout<<temp; } cout<<endl; } else if(length%3==2) { bool flag=0; if(q[0]*2+q[1]) { cout<<q[0]*2+q[1]; flag=1; } for(int i=2;i<4*length;i+=3) { int temp=0; for(int j=2;j>=0;j--) { temp+=g[j]*q[i+2-j]; } if(flag==0&&temp) { cout<<temp; flag=1; } else cout<<temp; } cout<<endl; } } } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |