藍橋杯題庫基礎練習:進制轉換


一、十六進制轉十進制

問題描述
  從鍵盤輸入一個不超過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);
    }
}
C語言

 

#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; 
}
C++

 

三、十進制轉十六進制

問題描述
  十六進制數是在程序設計時經常要使用到的一種整數的表示方式。它有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;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM