zcmu-2158
2158: G.ly的進制轉換
Time Limit:?1 Sec??Memory Limit:?128 MBSubmit:?77??Solved:?29
[Submit][Status][Web Board]
Description
ly去年有門課叫C語言基礎,今年的期末考試上有一道題目是"將16進制的數字39轉換成八進制",但是ly并不會算...
在去年考完試之后,發奮學習,并且只學習怎么把16進制的數字轉換成八進制...
今年的java考試剛好也有這個問題,但是ly缺忘了怎么算...所以你能幫她嗎?
Input
多組數據,第一行一個正整數T表示有T次詢問(T<=10)
接下來n行,每行一個由0~9、大寫字母A~F組成的字符串,表示要轉換的十六進制正整數
每個十六進制數長度不超過100000。
Output
輸出n行,每行為輸入對應的八進制正整數。
Sample Input
139Sample Output
71HINT
輸入的十六進制數不會有前導0,比如012A。輸出的八進制數也不能有前導0。
解析:16進制每個數為4個2進制為,8進制每個數位3個2進制位。所以就可以得到我們先求出16進制的全部2進制位,然后每3個數合成一個8進制位。 #include<bits/stdc++.h> using namespace std; const int maxn=100000+10; char a[17]="0123456789ABCDEF"; int main() {char s[maxn];int t;scanf("%d",&t);while(t--){scanf("%s",s);int l=strlen(s);int len=l*4%3;string ss;if(len==0)ss+="";else if(len==1)ss+="00";else ss+="0";//cout<<ss<<endl;for(int i=0; i<l; i++){switch(s[i]){case '0':ss+="0000";break;case '1':ss+="0001";break;case '2':ss+="0010";break;case '3':ss+="0011";break;case '4':ss+="0100";break;case '5':ss+="0101";break;case '6':ss+="0110";break;case '7':ss+="0111";break;case '8':ss+="1000";break;case '9':ss+="1001";break;case 'A':ss+="1010";break;case 'B':ss+="1011";break;case 'C':ss+="1100";break;case 'D':ss+="1101";break;case 'E':ss+="1110";break;case 'F':ss+="1111";break;//default :break;}}for(int i=0; i<ss.length(); i+=3){if(ss[i]=='0'&&ss[i+1]=='0'&&ss[i+2]=='0'){if(i==0)continue;else printf("0");}else if(ss[i]=='0'&&ss[i+1]=='0'&&ss[i+2]=='1')printf("1");else if(ss[i]=='0'&&ss[i+1]=='1'&&ss[i+2]=='0')printf("2");else if(ss[i]=='0'&&ss[i+1]=='1'&&ss[i+2]=='1')printf("3");else if(ss[i]=='1'&&ss[i+1]=='0'&&ss[i+2]=='0')printf("4");else if(ss[i]=='1'&&ss[i+1]=='0'&&ss[i+2]=='1')printf("5");else if(ss[i]=='1'&&ss[i+1]=='1'&&ss[i+2]=='0')printf("6");else if(ss[i]=='1'&&ss[i+1]=='1'&&ss[i+2]=='1')printf("7");}puts("");}return 0; }總結
- 上一篇: zcmu-2153(拓扑排序+优先队列)
- 下一篇: Mysql 连接的使用