本题要求实现一个将长整数转化成 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("%s\n", s);
return 0;
}
/* 你的代码将被嵌在这里 */
输入样例1:
123456789
输出样例1:
75BCD15
输入样例2:
-125
输出样例2:
-7D
来源:
来源:PTA | 程序设计类实验辅助教学平台
链接:https://pintia.cn/problem-sets/13/exam/problems/542
提交:
题解:
/*
* 将长整数转化成 16 进制字符串,并把转换所得的 16 进制字符串写入 p 所指向的数组
*/
void f(long int x, char *p) {
// x = 0 时 *p = '0',直接返回
if (x == 0) {
*p = '0';
return;
}
// pLength 记录字符串 p 的长度
int pLength = 0;
// 保证 x 为正数,方便进行模运算
if (x < 0) {
x = -x;
*p = '-';
pLength++;
}
// 求出数 x 对应的 16 进制所对应的位数以此得出字符串 p 的长度
for (long int tmp = x; tmp > 0; tmp /= 16) {
pLength++;
}
int index = 0;
while (x != 0) {
/*
* 余数 remainder 小于 10 对应字符 '0'-'9',否则对应字符 'A'-'F',
* *(p + pLength - 1 - index) 实现将所求得的字符逆序存放,符合进制转换规律
*/
int remainder = x % 16;
*(p + pLength - 1 - index) = remainder < 10 ? remainder + '0' : remainder - 10 + 'A';
index++;
x /= 16;
}
}