十进制于十六进制的互相转换

问题描述
  十六进制数是在程序设计时经常要使用到的一种整数的表示方式。它有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

今天先来个简单的吧十进制转十六进制题目中说要输入一个不超过2147483647的数字,那我们就来看看int,long int, long long int 的区别吧:

类型名称 字节数 取值范围
signed char 1 -128~+127
short int 2 -32768~+32767
int 4 -2147483648~+2147483647
long int 4 -2147483648~+2141483647
long long long int 8 -9223372036854775808~+9223372036854775807
unsigned 4 0~4,294,967,294

所以这道题我们用int就够了

#include<stdio.h>
main(){
	int a;
	scanf("%d",&a);
	printf("%X",a);
return 0;
}

试一下:
在这里插入图片描述
妥妥的ᕦ(・ㅂ・)ᕤ
接下来第二道题,Go Go Go!

问题描述
  从键盘输入一个不超过8位的正的十六进制数字符串,将它转换为正的十进制数后输出。
  注:十六进制数中的10~15分别用大写的英文字母A、B、C、D、E、F表示。
样例输入
FFFF
样例输出
65535

这道题和上一题对比一下,可以肯定8000000作为输入的话绝对会爆炸,就像这样:
在这里插入图片描述
所以,我就愉快的用了long long,嗯嗯,完美。

#include<stdio.h>
main(){
	long long a;
	scanf("%llx",&a);
	printf("%lld",a);
return 0;
}

做完之后发现网上的大神都是这样做的:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
 int main()
{
    int i;
    int len = 0;        //计算SUM长度
    char SUM[50];       //存储结果
    double index = 0;   //16的多少次幂
    long long sum = 0;  //结果
    int s_n = 0;        //计算十六进制数组长度
    double sixteen_1[8];//将输入的字符串数组转换成实数存入其中
    char sixteen[8];    //输入的字符串数组
    scanf("%s",sixteen);
    for(i = 0; i < 8; i++)
    {
        switch(sixteen[i])
        {
        case '0':
            sixteen_1[s_n++] = 0;
            break;
        case '1':
            sixteen_1[s_n++] = 1;
            break;
        case '2':
            sixteen_1[s_n++] = 2;
            break;
        case '3':
            sixteen_1[s_n++] = 3;
            break;
        case '4':
            sixteen_1[s_n++] = 4;
            break;
        case '5':
            sixteen_1[s_n++] = 5;
            break;
        case '6':
            sixteen_1[s_n++] = 6;
            break;
        case '7':
            sixteen_1[s_n++] = 7;
            break;
        case '8':
            sixteen_1[s_n++] = 8;
            break;
        case '9':
            sixteen_1[s_n++] = 9;
            break;
        case 'A':
            sixteen_1[s_n++] = 10;
            break;
        case 'B':
            sixteen_1[s_n++] = 11;
            break;
        case 'C':
            sixteen_1[s_n++] = 12;
            break;
        case 'D':
            sixteen_1[s_n++] = 13;
            break;
        case 'E':
            sixteen_1[s_n++] = 14;
            break;
        case 'F':
            sixteen_1[s_n++] = 15;
            break;
        }
    }
    index = (double)s_n;
    for(i = 0; i < s_n; i++)
    {
        sum += sixteen_1[i] * pow(16,index - 1);
        index--;
    }
    if(sum == 0)
    {
        SUM[len++] = '0';
    }
    else
    {
        for(; sum > 0; )
        {
            SUM[len++] = sum % 10 + '0';
            sum /= 10;
        }
    }
    for(i = len - 1; i >= 0; i--)
    {
        printf("%c",SUM[i]);
    }
    return 0;
}

作者:踏歌行

emmmmm。。。有点复杂。。。今天就这样了。愉快地凑够1000字,溜啦溜啦─=≡Σ(((つ•̀ω•́)つ

相关推荐
©️2020 CSDN 皮肤主题: 深蓝海洋 设计师:CSDN官方博客 返回首页