【C语言·pta】--长整数转化为十六进制字符串
本文主要讲解两种方法
目录
本题要求实现一个将长整数转化成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);
}
}