日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

十六进制转八进制(浅显易懂)

發(fā)布時間:2023/12/4 综合教程 44 生活家
生活随笔 收集整理的這篇文章主要介紹了 十六进制转八进制(浅显易懂) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

十六進制轉(zhuǎn)八進制

#分析+算法實現(xiàn)+代碼+測試數(shù)據(jù)
#技巧:分析+處理+調(diào)試(大不了就調(diào)試)

分析

這個題是藍橋杯的一道練習題,對于十六進制轉(zhuǎn)八進制的話,是可以通用的。
題目的描述大概是這樣的:給n個十六進制數(shù),n<=10,每個數(shù)的長度不超過10000。

這里涉及到字符型以及string類類類型,待會再強調(diào)。


下面分析一下此題:
要想把十六進制轉(zhuǎn)成八進制,首先想到把十六進制轉(zhuǎn)成二進制再轉(zhuǎn)成八進制。
于是,如何把十六進制數(shù)轉(zhuǎn)化成二進制01呢?首先想到的是偷懶,直接利用
c語言的scanf和printf類型轉(zhuǎn)換,真特么容易!

哦,差點忘掉了,每個十六進制數(shù)的長度不超過一萬!其實,我看到這里就
呵呵了,不是我不會,是懶的寫,字符串的一些操作太繁瑣,有些細節(jié)還要
耐心的處理,很容易就把一個人清晰的腦袋擰成一股麻繩,各種自我質(zhì)疑,
不過不要著急,所以保持冷靜,這種題還是很容易的,相信自己。
經(jīng)過分析,這道題的算法倒是很容易,如下:

每一個十六進制的值都可以轉(zhuǎn)化成4位二進制值,每三個二進制值組成一個八進制值,所以,先把十六進制轉(zhuǎn)換成01的二進制字串,然后把01串轉(zhuǎn)化成八進制。


算法實現(xiàn)

因為十六進制總共就十六個字符,這里使用switch對應(yīng)01碼進行選擇,然后對string對象str作+運算,逐個轉(zhuǎn)換成4位的01碼存入到string的對象str中,直到全部轉(zhuǎn)化成二進制代碼。

然后把二進制字串的長度*4%3求出存入一個變量r中。
如何求string類類型的長度呢?
1 str.length();
2 str.size();

接著有一個優(yōu)化技巧可以使用,(優(yōu)化技巧)就是這個
01串開始轉(zhuǎn)化八進制的時候該從哪開始?
如果余數(shù)為零,對誰取余從誰開始,否則從余數(shù)開始。

這個是我對代碼進行優(yōu)化后發(fā)現(xiàn)的。

然后就是如何轉(zhuǎn)化成八進制的整數(shù)輸出呢?當然是看01碼了。因為每三位一組成一個八進制值,使用一個變量ans記錄在三位中的哪個位上,使用sum+=pow(2,ans)轉(zhuǎn)化成數(shù)值,每執(zhí)行完一組,ans和sum歸初值。每次輸出sum值,最終輸出的就是目標的八進制。

因為是多組輸入數(shù)據(jù),而只定義了兩個string的對象對整個程序進行操作,所以
string類類型的對象如何清零呢?
1 str.clear()//使用clear()函數(shù);
2 str="";//賦空

小插曲(可以不看,為了擰回博主的腦回路而寫)

之前我常常會把string類類型char型混用,如今我終于弄明白了。

比如:
之前我會這樣寫,scanf輸出string類型的對象值。
string str;printf("%s",str);
哎?為什么會報錯?

或者說會寫成這樣,使用c的函數(shù)企圖得到string型對象的長度。
string str; int len=strlen(str);

后來的后來,我終于明白了,之前學習c的時候順帶學的c++,我一直把這string 和 char型的東西當成一家的,其實,他們只是有關(guān)系,但是不是一家的,東西也不能亂串使用,string是字符串類類型。

(這里我使的是string類型的對象對字符串進行操作。)

代碼

//利用switch+string類型
//注意字符串要雙引號#include<stdio.h>
#include<iostream>
#include<string>
#include<string.h>
#include<math.h>
using namespace std;
int main(){int n;string str_temp,str_in;scanf("%d",&n);for(int i=0;i<n;i++){str_in="";str_temp="";//給字符串賦空cin>>str_in;int len=str_in.length();for(int j=0;j<len;j++){switch(str_in[j]){case '0': str_temp+="0000";break;case '1': str_temp+="0001";break;case '2': str_temp+="0010";break;case '3': str_temp+="0011";break;case '4': str_temp+="0100";break;case '5': str_temp+="0101";break;case '6': str_temp+="0110";break;case '7': str_temp+="0111";break;case '8': str_temp+="1000";break;case '9': str_temp+="1001";break;case 'A': str_temp+="1010";break;case 'B': str_temp+="1011";break;case 'C': str_temp+="1100";break;case 'D': str_temp+="1101";break;case 'E': str_temp+="1110";break;case 'F': str_temp+="1111";break;default: break;}}//cout<<str_temp<<endl;//把01串轉(zhuǎn)化成目標串int len_s=str_temp.length();int ans=2;int sum=0;int r=len*4%3;if(r==1){if(str_temp[0]=='1')printf("1");}else if(r==2){if(str_temp[0]=='0'&&str_temp[1]=='1')printf("1");else if(str_temp[0]=='1'&&str_temp[1]=='0')printf("2");else if(str_temp[0]=='1'&&str_temp[1]=='1')printf("3");}else{if(str_temp[0]=='0'&&str_temp[1]=='0'&&str_temp[2]=='0')r=3;}for(int i=r;i<len_s;i++){if(str_temp[i]=='1')sum+=pow(2,ans);ans--;if(ans==-1){printf("%d",sum);ans=2;sum=0;}}printf("\n");}
}

測試數(shù)據(jù)

輸入
2
39
123ABC

輸出
71
4435274

總結(jié)

以上是生活随笔為你收集整理的十六进制转八进制(浅显易懂)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。