【C语言·pta】--长整数转化为十六进制字符串

本文主要讲解两种方法

目录

法一、暴力转换

法二、库函数法--sprintf


本题要求实现一个将长整数转化成16进制字符串的简单函数。

函数接口定义:
void f( long int x, char *p );
其中x待转化的十进制长整数p指向某个字符数组的首元素。函数f的功能是把转换所得的16进制字符串写入p所指向的数组。16进制的A~F为大写字母。

裁判测试程序样例:

#include <stdio.h>
#define MAXN 10

void f( long int x, char *p );

int main()
{
    long int x;
    char s[MAXN] = "";
    
    scanf("%ld", &x);
    f(x, s);
    printf("%sn", s);
    
    return 0;
}

/* 你的代码将被嵌在这里 */


输入样例1:
123456789
输出样例1:
75BCD15
输入样例2:
-125
输出样例2:
-7D

首先要了解十进制如何转化为十六进制:

对于十进制转为任何进制都是 整数部分:除以基数(比如8进制的基数为8,16进制的基数为16)取余数(倒记的余数)。小数部分:乘以基数取整数部分(正记的整数),直到这个小数为0,如果是循环就另当讨论。

 知道如何转换10进制为16进制后,就可以用代码思路来实现转换,因为本题不涉及十进制小数部分转换为16进制,所以只需要考虑整数部分如何转换为16进制即可。

法一、暴力转换

关键步骤:①、求余数并且倒记  ②、倒记的余数转换为16进制的对应大写字母

需要考虑的小问题:①、负数的时候怎么办 ②、求出的余数如何倒记

思路:

①、判断是否为负数,如果是,则增加一个符号

②、先得到一个x%16的余数,转为对应的16进制字符

③、得到的余数倒记

详细讲解均在代码中:

#include <stdio.h>
#define MAXN 10

void f(long int x, char* p)
{
    int i = 0;
    while (x)
    {//一、如果这个数是负数
        if (x < 0)
        {//第一个元素置为-
         //负数再变为正数,方便进行下面的转换操作
            p[i++] = '-';
            x = -x;
        }
        p[i] = x % 16;
    //二、10进制转16进制
        if (p[i] > 9)//如果得出的16进制的数>9就要考虑转化为字母的情况
        {//16进制范围:0~9,A(16进制代表10,它对应ASC码为65,所以得出的16进制数+55,就可以转换为对应的字母) B(11) C(12) D(13) E(14) F(15)
         //我们算出来的是数字,而我们要存入字符数组(有可能是16进制有字母的原因),所以要从数字转换为字符
            p[i] += 55;//大于9就转换为对应的大写字母
            i++;
        }
        else
        {
            p[i] += 48;//<=9就应把对应的数字转换为字符,因为字符0~9的ASC码对应为48~57,所以数字转换为字符就+48即可
            i++;
        }
        x /= 16;
    }
    p[i] = '';
    //三、逆置字符数组,因为10进制转16进制,对应余数是倒着数的
    int left = (p[0] == '-') ? 1 : 0, right = i - 1;//负数的话就要从下一个下标为left倒置
    while (left < right)
    {
        char temp = p[left];
        p[left] = p[right];
        p[right] = temp;
        left++;
        right--;
    }
}

int main()
{
    long int x;
    char s[MAXN] = "";

    scanf("%ld", &x);
    f(x, s);
    printf("%sn", s);

    return 0;
}

法二、库函数法--sprintf

首先回顾sprintf

函数原型

int sprintf(char* buffer,const char* format[,argument] ...);

第一个参数:需要写入的字符串

第二个参数:需要打印成什么形式%d %f等等均可以(格式化字符串)

第三个参数:变量

函数功能:把格式化数据写入字符串中

例子:

①、把整数123打印成一个字符串保存在s中

sprintf(s,"%d",123);-----则s字符数组中放着字符123

printf("%s",s);-------------则打印字符123

再科普一下%x:

%x只能用于输出无符号整数和指针类型的变量,如果用于输出有符号整数,结果可能出错。

所以如果这个数是负数(又称有符号数),就要先转化为无符号的,然后再用%x才可以

代码如下:

void f(long int x, char* p)
{
	if (x < 0)
	{
		sprintf(p, "-%X", -x);
//先把数转换为正数,这样才能被%x正确转化
//然后转换为16进制,写入字符数组p中
//其中%x前面加个-,就会把转化后的16进制数从整数转化为负数了
	}
	else
	{
		sprintf(p, "%X", x);
	}
}