PTA长整数转化成16进制字符串 分数 15 作者 张泳 单位 浙大城市学院

本题要求实现一个将长整数转化成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
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB

答案:

void f(long int x, char* p)
{
    // 初始化两个相同的变量 sub1 和 sub2 为输入值 x
    long int sub1 = x, sub2 = x;
    int cnt = 0, end = 0, rest;

    // 如果输入值为 0,直接将字符数组 p 设置为 '0' 并返回
    if (x == 0)
    {
        *p = '0';
        return;  // 同学们思考一下,如果没有这一句,会发生什么。
    }

    // 如果输入值为负数,将 sub1 和 sub2 取相反数
    if (x < 0)
    {
        sub1 = -sub1;
        sub2 = -sub2;
    }

    // 计算十六进制表示中的位数
    while (sub1)
    {
        cnt++;
        sub1 /= 16;
    }

    // 设置结束位置和字符串结束符
    end = cnt - 1;
    p[cnt] = '\0';

    // 从高位到低位填充字符数组 p
    for (; end >= 0; end--)
    {
        rest = sub2 % 16;

        // 根据余数的大小选择 'A' 到 'F' 或 '0' 到 '9'
        if (rest > 9)
        {
            p[end] = rest + 'A' - 10;
        }
        else
        {
            p[end] = rest + '0';
        }

        // 除以 16,继续处理下一位
        sub2 /= 16;
    }

    // 如果输入值为负数,输出负号
    if (x < 0)
        printf("-");
}

没错,同学们很厉害,后果就是当输入0时,输出为空,同学们思考一下为什么。
可以在评论区回复我一下。

即使不加return,也可以通过PTA的所有测试用例,所以说明PTA这道题的测试用例是有问题的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

约束112

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值