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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

基础练习 十六进制转八进制 c语言

發布時間:2024/1/23 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 基础练习 十六进制转八进制 c语言 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

基礎練習 十六進制轉八進制
問題描述
  給定n個十六進制正整數,輸出它們對應的八進制數。

輸入格式
  輸入的第一行為一個正整數n (1<=n<=10)。
  接下來n行,每行一個由09、大寫字母AF組成的字符串,表示要轉換的十六進制正整數,每個十六進制數長度不超過100000。

輸出格式
  輸出n行,每行為輸入對應的八進制正整數。

【注意】
  輸入的十六進制數不會有前導0,比如012A。
  輸出的八進制數也不能有前導0。

樣例輸入
  2
  39
  123ABC

樣例輸出
  71
  4435274

【提示】
  先將十六進制數轉換成某進制數,再由某進制數轉換成八進制。
這個代碼是看的其他網友的,看起來比較復雜,后來我想了一下,可以先把這個十六進制轉成十進制,再轉換成八進制%O就很簡單易懂,后面文章有我寫的十六進制轉成十進制的代碼,可以試一下。

#include<stdio.h> #include<string.h>int main() {int n,i,j,k,a,cur,ok,m,l;char s[10][100001];char d16[16][5]={"0000","0001","0010","0011","0100","0101","0110","0111","1000","1001","1010","1011","1100","1101","1110","1111"};char out[140000]={};char z[13]={};scanf("%d",&n); for(j=0;j<n;j++)scanf("%s",s[j]);for(j=0;j<n;j++) {k=0;ok=1;m=0; /*初始化標記數據*/ l=strlen(s[j]); /* 初始化標記數據*/ a=3-l%3; /*初始化標記數據*/ //求出要將這個十六進制數補足為3的倍數需要補上多少個0if(a==3) ok=0; /*十六進制數長度剛好為3的倍數時轉二進制不需補0,ok標記其是否為3的倍數0是1不是*/ for(i=0;i<l;i++) /*逐位讀取十六進制數進行轉換*/ {if(65<=s[j][i]) s[j][i]-=7; //這里不理解請查閱ASCII代碼表if(ok) /*十六進制數位數不足轉二進制時補0占位*/ if(a==1){ //若需補一個十六進制的0,相當于補上四個二進制的0即0000,下面補兩位也一樣strcat(z,"0000");k=k+4;ok=0;}else if(a==2){strcat(z,"00000000");k=k+8;ok=0;}z[k++]=d16[s[j][i]-48][0]; /*一位十六進制轉四位二進制*/ z[k++]=d16[s[j][i]-48][1];z[k++]=d16[s[j][i]-48][2];z[k++]=d16[s[j][i]-48][3];if(k==12) /*每轉三位十六進制數將其轉為四位八進制數*/ {for(cur=0;cur<12;m++)out[m]=((z[cur++]-48)*4+(z[cur++]-48)*2+(z[cur++]-48)*1)+48;z[0]='\0';k=0; /*z[0]='\0'初始化字符串結束符位置避免溢出*/ }} for(;k<3;k++) /*輸出時忽略前導0*/ if(out[k]!=48) break; //48是字符‘0’的ASCII值for(;k<m;k++)printf("%c",out[k]);putchar('\n');}return 0;}

總結

以上是生活随笔為你收集整理的基础练习 十六进制转八进制 c语言的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。