这代码她不美吗?——试题 基础练习 十六进制转八进制
生活随笔
收集整理的這篇文章主要介紹了
这代码她不美吗?——试题 基础练习 十六进制转八进制
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
都開始做藍橋杯了, 還想啥最優解法啊? 暴力它不香嗎 不動腦它不香嗎? 這代碼她不美嗎?
儲備知識
16進制轉化為2進制:從最大位數開始,每一位都轉化成4位二進制數。
如:34(16進制)——>0011 0100(二進制)。 其中,3轉化為0011,4轉化為0100。二進制轉化為八進制:同理,從最后一位往前,三個三個取,不夠三個就補0。
如:0011 0100(二進制)——>000 110 100(二進制)——>064(八進制)——>64(八進制)。
注意點:
1、注意輸入要求小于10000位的16進制數,是小于10000位,不是小于10000!
2、輸入格式為字符串,將16進制轉化為2進制,2進制再轉化為八進制輸出。
3、注意字符串的遍歷順序(正向遍歷還是反向遍歷)
4、動腦子的解法是:寫一個x進制自由轉化為n進制的函數。調用函數轉化后輸出。參考大數運算的解法。
代碼:
#include<bits/stdc++.h> using namespace std; int main() {int n; cin >> n; while(n--) {string s,s1; cin >> s;int len = s.length();for(int i = 0; i < len; i++) {switch(s[i]) {case '0' : s1+="0000"; break;case '1' : s1+="0001"; break;case '2' : s1+="0010"; break;case '3' : s1+="0011"; break;case '4' : s1+="0100"; break;case '5' : s1+="0101"; break;case '6' : s1+="0110"; break;case '7' : s1+="0111"; break;case '8' : s1+="1000"; break;case '9' : s1+="1001"; break;case 'A' : s1+="1010"; break;case 'B' : s1+="1011"; break;case 'C' : s1+="1100"; break;case 'D' : s1+="1101"; break;case 'E' : s1+="1110"; break;case 'F' : s1+="1111"; break;}} int len1 = s1.length();if(len1 % 3 == 1) { s1.insert(0,"00"); len1 += 2; } if(len1 % 3 == 2) { s1.insert(0,"0"); len1 += 1; }string s3; //存放結果 bool flag = false;for(int i = 0; i < len1; i += 3) {string s2 ; s2 += s1[i]; s2 += s1[i+1]; s2 += s1[i+2];if(s2 == "000" && flag == true) s3 += "0";else if(s2 == "001") { s3 += "1"; flag = true; }else if(s2 == "010") { s3 += "2"; flag = true; }else if(s2 == "011") { s3 += "3"; flag = true; }else if(s2 == "100") { s3 += "4"; flag = true; }else if(s2 == "101") { s3 += "5"; flag = true; }else if(s2 == "110") { s3 += "6"; flag = true; }else if(s2 == "111") { s3 += "7"; flag = true; }}cout << (n ? s3+'\n' : s3);}return 0;}總結
以上是生活随笔為你收集整理的这代码她不美吗?——试题 基础练习 十六进制转八进制的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 蓝桥杯 试题 入门训练 序列求和——6行
- 下一篇: 蓝桥杯 试题 基础练习 十六进制转十进制