一、十六進制轉十進制
問題描述
從鍵盤輸入一個不超過8位的正的十六進制數字符串,將它轉換為正的十進制數后輸出。
注:十六進制數中的10~15分別用大寫的英文字母A、B、C、D、E、F表示。
樣例輸入
FFFF
樣例輸出
65535
分析:按16進制展開;按數位依次操作,每次將前面的乘16,再加上當前數位的值。
C語言代碼
#include<stdio.h> #include<string.h> #include<math.h> int main(){ char strHex[10]; //設定字符串長度 int i = 0, len = 0, temp = 0; long long answer = 0; gets(strHex); len = strlen(strHex); for (i = 0; strHex[i] != '\0'; ++i){ switch(strHex[i]){ case 'A': temp = 10; break; case 'B': temp = 11; break; case 'C': temp = 12; break; case 'D': temp = 13; break; case 'E': temp = 14; break; case 'F': temp = 15; break; default: temp = strHex[i]-'0'; break; } answer += (temp*pow(16,len-1-i)); //pow函數作用:計算x的 y次方 } printf("%lld",answer); return 0; }
C++代碼
#include<iostream> #include<string> using namespace std; int main() { string s; while(cin>>s) { int leth=s.length(); long long sum=0; for(int i = 0;i < leth;i++) { if(s[i]>='A' && s[i]<='F') sum=sum*16 + s[i]-'A'+10; else sum=sum*16 + s[i]-'0'; } cout<<sum<<endl; } return 0; }
二、十六進制轉八進制
問題描述
給定n個十六進制正整數,輸出它們對應的八進制數。
輸入格式
輸入的第一行為一個正整數n (1<=n<=10)。
接下來n行,每行一個由0~9、大寫字母A~F組成的字符串,表示要轉換的十六進制正整數,每個十六進制數長度不超過100000。
輸出格式
輸出n行,每行為輸入對應的八進制正整數。
注意
輸入的十六進制數不會有前導0,比如012A。
輸出的八進制數也不能有前導0。
樣例輸入
2
39
123ABC
樣例輸出
71
4435274
提示
先將十六進制數轉換成某進制數,再由某進制數轉換成八進制。

#include <stdio.h> #include <stdlib.h> #include <string.h> #define MaxSize 100000 void saveB(char *b,char c3,char c2,char c1,char c0,int start) { b[start]=c3; b[start+1]=c2; b[start+2]=c1; b[start+3]=c0; } int htob(char *h,char *b) { int i,j; int hl=strlen(h); for(i=0;i<hl;i++) switch(h[i]) { case '0': { saveB(b,'0','0','0','0',4*i); break; } case '1': { saveB(b,'0','0','0','1',4*i); break; } case '2': { saveB(b,'0','0','1','0',4*i); break; } case '3': { saveB(b,'0','0','1','1',4*i); break; } case '4': { saveB(b,'0','1','0','0',4*i); break; } case '5': { saveB(b,'0','1','0','1',4*i); break; } case '6': { saveB(b,'0','1','1','0',4*i); break; } case '7': { saveB(b,'0','1','1','1',4*i); break; } case '8': { saveB(b,'1','0','0','0',4*i); break; } case '9': { saveB(b,'1','0','0','1',4*i); break; } case 'A': { saveB(b,'1','0','1','0',4*i); break; } case 'B': { saveB(b,'1','0','1','1',4*i); break; } case 'C': { saveB(b,'1','1','0','0',4*i); break; } case 'D': { saveB(b,'1','1','0','1',4*i); break; } case 'E': { saveB(b,'1','1','1','0',4*i); break; } case 'F': { saveB(b,'1','1','1','1',4*i); break; } } return 4*hl; } int btoo(char *b,char *o,int bl) { int i,j; int ol; int value; if(bl%3==0) ol=bl/3; else ol=bl/3+1; j=bl-1; for(i=ol-1;i>=0;i--) { if(i>0) o[i]=b[j]-48+(b[j-1]-48)*2+(b[j-2]-48)*4+48; else { switch(j) { case 2: o[i]=b[j]-48+(b[j-1]-48)*2+(b[j-2]-48)*4+48; break; case 1: o[i]=b[j]-48+(b[j-1]-48)*2+48; break; case 0: o[i]=b[j]; break; } } j=j-3; } return ol; } void printO(char *o,int ol) { int i=0; if(o[0]=='0') i=1; for(;i<ol;i++) { printf("%c",o[i]); } printf("\n"); } main() { char h[MaxSize]; char b[4*MaxSize]; char o[4*MaxSize/3+1]; int n,i,bl,ol; scanf("%d",&n); getchar(); for(i=0;i<n;i++) { gets(h); bl=htob(h,b); ol=btoo(b,o,bl); printO(o,ol); } }

#include <iostream> #include <stdio.h> #include <string.h> #include <STDLIB.H> int GetI(char c) { return c>>4&1?c&15:(c&15)+9; } int main(int argc, char *argv[]) { char arr[200001] = {'\0'}; char brr[400001] = {'\0'}; int n = 0; int i = 0; scanf("%d",&n); for(i = 0;i < n;i++) { scanf("%s",arr); int m[3] = {1,16,256}; int len = strlen(arr); int j = len-1; int a,b,c; a = b = c = 0; int k = 0,l = 0; int count = 0; while(j>-1) { a += (arr[j]>>4&1?arr[j]&15:(arr[j]&15)+9)*m[k]; //個位 if(k==2||j==0) { while(a) { brr[l++] = ((a&7)|48); a = a>>3; count++; } while(j!=0&&count<4) { brr[l++] = '0'; count++; } count = 0; } k = (k+1)%3; j--; } strrev(brr); printf("%s\n",brr); memset(arr,'\0',(sizeof(char)*200001)); memset(brr,'\0',(sizeof(char)*400001)); } return 0; }
三、十進制轉十六進制
問題描述
十六進制數是在程序設計時經常要使用到的一種整數的表示方式。它有0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F共16個符號,分別表示十進制數的0至15。十六進制的計數方法是滿16進1,所以十進制數16在十六進制中是10,而十進制的17在十六進制中是11,以此類推,十進制的30在十六進制中是1E。
給出一個非負整數,將它表示成十六進制的形式。
輸入格式
輸入包含一個非負整數a,表示要轉換的數。0<=a<=2147483647
輸出格式
輸出這個整數的16進制表示
樣例輸入
30
樣例輸出
1E
#include <stdio.h> #include <stdlib.h> char data[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'}; void Print(char *num,int n) { int i; for(i=n-1;i>=0;i--) printf("%c",num[i]); printf("\0"); printf("\n"); } //將十六進制數轉換為十進制數 int Transform(char *num,long long value) { int n=0; while(value>=16) { num[n++]=data[value%16]; value/=16; } num[n++]=data[value%16]; return n; } int main() { long long value; char num[10]; int n; scanf("%I64d",&value); n=Transform(num,value); Print(num,n); return 0; }