首页 > 试题广场 >

进制转换

[编程题]进制转换
  • 热度指数:968233 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
\hspace{15pt}对于给定的十六进制数,输出其对应的十进制表示。
\hspace{15pt}在本题中,十六进制数的格式为:\texttt{0x} 开头,后跟若干个十六进制数字( \texttt{0-9}\texttt{A-F} )。其中,\texttt{A-F} 依次代表 10-15

输入描述:
\hspace{15pt}在一行上输入一个十六进制数 s ,代表待转换的十六进制数。
\hspace{15pt}保证 s 转化得到的十进制数 x 的范围为 1 \leqq x \leqq 2^{31}-1


输出描述:
\hspace{15pt}在一行上输出一个整数,代表 s 对应的十进制数。
示例1

输入

0xFA93

输出

64147

说明

\hspace{15pt}回忆十六进制转化为十进制的方法:从右往左,将第 i 位乘以 {\color{orange}{16^i}} ,然后求和。

\hspace{15pt}在这个样例中,\texttt{0xFA93} 的第 0 位是 \texttt{3} ,第 1 位是 \texttt{9} ,第 2 位是 \texttt{A} ,第 3 位是 \texttt{F} ,因此 \texttt{0xFA93} = 3 \times {\color{orange}{16^0}} + 9 \times {\color{orange}{16^1}} + 10 \times {\color{orange}{16^2}} + 15 \times {\color{orange}{16^3}} = 64147
#include <stdio.h>
#include <string.h>


int main() {
    char s[100]; // 定义一个足够大的字符数组来存储输入的字符串
    int i, num = 0, power = 1;

    // 读取输入的字符串
    scanf("%s", s);

    // 跳过 "0x" 前缀
    if (s[0] == '0' && s[1] == 'x') {
        // 从第三个字符开始处理
        for (i = strlen(s) - 1; i >= 2; i--) {
            // 处理每一位字符
            if ((s[i])>='0'&&(s[i])<='9') {
                // 数字字符
                num += (s[i] - '0') * power;
            } else {
                // 字母字符
                if ((s[i])>='A' && (s[i])<='Z') {
                    num += (s[i] - 'A' + 10) * power;
                } else if((s[i])>='a' && (s[i])<='z') {
                    num += (s[i] - 'a' + 10) * power;
                }
            }
            // 更新权值
            power *= 16;
        }
    }

    // 输出结果
    printf("%d\n", num);

    return 0;
}

发表于 2025-03-25 21:51:17 回复(0)
秒了
#include <stdio.h>

int main() {
    unsigned int s;
    scanf("%x", &s);

     printf("%u\n", s);
     
    return 0;
}


发表于 2025-03-12 09:58:20 回复(0)
#include <stdio.h>
#include <math.h>

int main() {
    int x_16, i, digit = 0;
    int x_10 = 0;
    char str[5];

    scanf("%x", &x_16);
    //printf("%u", x_16);             //速通路线
    sprintf(str, "%x", x_16);       //将十六进制数转换为字符串

    while (str[digit++] != '\0') {
    }
    digit--;                        //抵消上面多加的一次
    for (i = 0; i < digit; i++) {
        if ((str[i] >= 65 && str[i] <= 70) || (str[i] >= 97 &&
                                               str[i] <= 102)) {    //ASCII码转化
            x_10 += (int)pow(16, digit - i - 1) * (str[i] > 77 ? str[i] - 87 : str[i] - 55);
        } else {
            x_10 += (int)pow(16, digit - i - 1) * (str[i] - 48);
        }
    }
    printf("%d", x_10);
    return 0;
}

发表于 2024-12-20 20:53:34 回复(1)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main() {
    char strdata[11];
    char *pos;
    int sum=0;
 
    while (scanf("%s", strdata) != EOF)
    {
        // 注意 while 处理多个 case
        // 64 位输出请用 printf("%lld") to
        pos=strchr(strdata,'x');
        if(pos==NULL)
            printf("Error data");
        else
        {
            if(*(++pos)!='\0')
            {
                sum=strtol(pos,NULL,16);
            }
            printf("%d",sum);
        }
    }
    return 0;
}
发表于 2024-12-04 11:26:02 回复(0)
#include <stdio.h>
#include <stdlib.h>

// int main() {
//     char hexString[20];
//     long decimalValue;

//     while (scanf("%s", hexString) != EOF) { // 注意 while 处理多个 case
//         decimalValue = strtol(hexString, NULL, 16);
//         printf("%ld\n",decimalValue);
//     }
//     return 0;
// }

int hex(char c){
    if (c >='0'&& c <= '9'){
        return c - '0';
    }else if (c >= 'A' && c <= 'F'){
        return c - 'A' +10;
    }else if (c >= 'a' && c <= 'f'){
        return c - 'a' +10;
    }
    return 0;;
}

int main(){
    char hexString[20];
    long long decimalValue;

    while(scanf("%s",hexString) != EOF){
        decimalValue = 0;
        int len = strlen(hexString);

        for (int i=0; i<len; i++){
            if(i==0 && hexString[i]=='0'&& (hexString[i+1]=='x'||hexString[i+1]=='X')){
                i +=1;
                continue;
            }

            decimalValue = decimalValue *16 + hex(hexString[i]);
        }
        printf("%lld\n",decimalValue);
    }
    return 0;
}

发表于 2024-10-09 10:36:28 回复(0)
#include <stdio.h>
#include <stdlib.h>

int main() {
    char input[32];
    unsigned int number;

    //输入一个十六进制数
    scanf("%31s", input); // 读取整个字符串,最后一位是停止符
    //把input内容解释为%x十六进制数,存储到变量number里
    if (sscanf(input, "%x", &number) == 1) {
        printf("%u\n",number);
    }
}

发表于 2024-08-13 22:45:49 回复(0)
不是,哥们,10秒,不能再多了
#include <stdio.h>
int main() {
    int x;
    scanf("%x",&x);
    printf("%d",x);
    return 0;
}
发表于 2024-07-21 15:57:35 回复(3)
#include <stdio.h>
#include<string.h>
int main()
{
    int num=0;
    char str[100];
    char b[16] = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
    int shiji = 0;
    printf("输入十六进制数0x");
    fgets(str, sizeof(str), stdin); // 使用fgets安全读取整行字符串
    num = strlen(str);
    str[num]= '\0';
    int index = 1;
    for (int i = num-1; i >=0;)
    {
       
        for (int j = 0;j < 16; j++)
        {
            if (j < 10)
            {
                if (str[i] == b[j])
                {
                  
                    shiji = shiji+j*index;
                    index = index * 16;
                }
            }
            if (j >= 10 && j <= 15)
            {
                if (str[i] == b[j])
                {
                    shiji = shiji + j * index;
                    index = index * 16;
                }
            }
        }
        
        i--;
       
    }
        printf("%d\n", shiji);
        return 0;

}

发表于 2024-07-12 21:04:14 回复(0)
#include <stdio.h>

int main() {
    unsigned int a = 0;

    scanf("%x", &a);
    printf("%d", a);
   
    return 0;
}
发表于 2024-06-08 22:43:11 回复(0)
#include <stdio.h>

int main() {
    int a;
    scanf("%x", &a);
    printf("%d", a); //十六进制和十进制在内存中是一样的
    return 0;
}

发表于 2024-05-16 14:28:28 回复(0)
#include <stdio.h>

int main() {
    char hex[20]; 
    while (scanf("%s", hex) != EOF) {
        int z;
        sscanf(hex, "%x", &z);
        printf("%d\n", z);
    }
    return 0;
}

发表于 2023-12-21 20:25:14 回复(0)
1.指导思想:十六进制与十进制的2的特殊关系,十六进制数值可以看成是2的各种幂次方之和。
2.思路:
(1) 题目给了值范围1到2^23-1,也就是需要用unsigned int
(2) 根据指导思想,关键就是找到哪些次幂,手段就是使用移位操作和按位与。
#include <stdio.h>

unsigned int cal_mi(unsigned int arg, int i)
{
    unsigned int res = 1;
    while(i--)
        res *= arg;

    return res; 
}
int main() {
    int i = 0;
    unsigned int hex;
    unsigned int res=0;
    while(scanf("%x", &hex) != EOF)
    {
        for (i=0; i < 32 ; i++){
            if ((hex >> i) & 0x1)
                res += cal_mi(2,i);
        }
        printf("%u\n", res);
    }
  
    return 0;
}


发表于 2023-11-25 11:14:06 回复(0)
#include <stdio.h>
int main() {
    char c;int t = 0;
    while (getchar()!='x');
    c=getchar();
    while (c!=' '&&c!='\n'&&c!=EOF) {
        switch (c) {
            case '0':t=(t<<4)+0;break;
            case '1':t=(t<<4)+1;break;
            case '2':t=(t<<4)+2;break;
            case '3':t=(t<<4)+3;break;
            case '4':t=(t<<4)+4;break;
            case '5':t=(t<<4)+5;break;
            case '6':t=(t<<4)+6;break;
            case '7':t=(t<<4)+7;break;
            case '8':t=(t<<4)+8;break;
            case '9':t=(t<<4)+9;break;
            case 'a':t=(t<<4)+10;break;
            case 'b':t=(t<<4)+11;break;
            case 'c':t=(t<<4)+12;break;
            case 'd':t=(t<<4)+13;break;
            case 'e':t=(t<<4)+14;break;
            case 'f':t=(t<<4)+15;break;
            case 'A':t=(t<<4)+10;break;
            case 'B':t=(t<<4)+11;break;
            case 'C':t=(t<<4)+12;break;
            case 'D':t=(t<<4)+13;break;
            case 'E':t=(t<<4)+14;break;
            case 'F':t=(t<<4)+15;break;
        }c=getchar();
    }printf("%d\n",t);
   
    return 0;
}
发表于 2023-09-24 17:34:46 回复(1)
#include <stdio.h>
#include <string.h>
#include <math.h>

int main(void)
{
    char str[50] = {0};
    int i = 0,ShiJinZhi = 0,len;
    
    gets(str);    
    len = strlen(str);
    while(len-- > 2)
    {
        if(str[len] >= 'a' && str[len] <= 'z')
        {
            str[len] = (int)str[len] - 87;
        }
        else if(str[len] >= 'A' && str[len] <= 'Z')
        {
            str[len] = (int)str[len] - 55;
        }
        else if(str[len] >= '0' && str[len] <= '9')
        {
            str[len] = (int)str[len] - 48;
        }
        ShiJinZhi += str[len]*pow(16,i);
        i++;
    }
    printf("%d",ShiJinZhi);
    
    return 0;
}
 
发表于 2023-09-10 21:24:32 回复(0)
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main() {
    char str[100]={0};
    int result=0,index=0;
    scanf("%s",str);
    int len=strlen(str);
    for(int i=len-1;i>=2;i--)
    {
        if(str[i]>='0'&&str[i]<='9')//数字0~9
            result+=(int)((str[i]-'0')*pow(16, index));
        else//字母A~F
        {
            switch (str[i]-'A')
            {
                case 0:
                    result+=(int)(10*pow(16, index));
                    break;
                case 1:
                    result+=(int)(11*pow(16, index));
                    break;
                case 2:
                    result+=(int)(12*pow(16, index));
                    break;
                case 3:
                    result+=(int)(13*pow(16, index));
                    break;
                case 4:
                    result+=(int)(14*pow(16, index));
                    break;
                case 5:
                    result+=(int)(15*pow(16, index));
                    break;
            }
        }
        index++;
    }
    printf("%d\n",result);
    return 0;
}
发表于 2023-08-29 18:35:47 回复(0)
/**  题目:HJ5 进制转换
  *  思路:数据用 %x 十六进制输入,输出 %d 十进制
  *  难点:内置的十六进制输入和十进制输出
  */
#include <stdio.h>

int main() {
    int num;

    scanf("%x", &num);

    printf("%d", num);

    return 0;
}

/**  题目:HJ5 进制转换
  *  思路:输入数据用字符串存储,从第三位字符开始遍历字符串,用秦九韶算转化进制
  *  难点:字符串的 abcdef 、ABCDEF 和 0123456789 如何转化为十进制数
  */
#include <stdio.h>
#include <string.h>

int main() {
    char str[20];
    int num = 0;
    int len;

    gets(str);
    len = strlen(str);

    // 用秦九韶算法转化进制,分情况讨论: aA、bB、cC、dD、eE、fF分开讨论,0123456789 转化为数字后表示 48~57,减去48
    for(int i = 2; i < len; i++) {
        switch (str[i]) {
            case 'a':
            case 'A':
                num = num * 16 + 10;
                break;
            case 'b':
            case 'B':
                num = num * 16 + 11;
                break;
            case 'c':
            case 'C':
                num = num * 16 + 12;
                break;
            case 'd':
            case 'D':
                num = num * 16 + 13;
                break;
            case 'e':
            case 'E':
                num = num * 16 + 14;
                break;
            case 'f':
            case 'F':
                num = num * 16 + 15;
                break;
            default:

                //  字符中的 0123456789 转化为 int 型后表示 48 ~ 57,-48 即可表示 0 ~ 9
                num = num * 16 + ((int)str[i] - 48);
                break;
        }
    }

    printf("%d", num);

    return 0;
}

发表于 2023-03-26 19:08:04 回复(0)
#include <stdio.h>
#include <string.h>

int main() {
    long num_16;
    scanf("%x",&num_16);
    printf("%d",num_16);
    return 0;
}

发表于 2023-03-25 22:20:05 回复(1)
第一次独立完成哈哈哈哈
#include <stdio.h>

int main() {

    int a;

    scanf("%x",&a);
    printf("%d",a);
    
    return 0;
}


发表于 2023-02-28 21:27:19 回复(0)

问题信息

难度:
61条回答 166970浏览

热门推荐

通过挑战的用户

查看代码
进制转换