[code] PTA 胡凡算法笔记 DAY011

题目B1022 D进制的A+B

在这里插入图片描述

  • 题意
    将十进制A+B的结果转换为D进制的数输出。

  • 思路
    这里看A,B的范围知道int类型即可。然后在进制转换的时候需要倒着输出最后的结果,所以我这里算是偷懒用string类型存储最后的结果并且每求出一位采用头插法插入字符串。

注意点:需要判断A+B为0的情况。

  • Code in C++
#include <iostream>
#include <string>

std::string tr2D(int num, int D)
{
    std::string result = "";
    if (num == 0) {
        result = "0";
    }
    while (num) {
        result.insert(0, 1, '0' + num % D);
        num = num / D;
    }
    return result;
}

int main()
{
    int A, B, D;
    std::cin >> A >> B >> D;

    std::cout << tr2D(A+B,D) << std::endl;
    return 0;
}


题目B1037 在霍格沃茨找零钱

在这里插入图片描述

  • 题意
    按兑换规则计算两数之差。

  • 思路

  1. 我这里实现就是直接按最直接的思路两数相减,从最低位开始然后不够借位来实现的。我这里需要注意当结果为负数的时候需要处理一下。
  2. 另外一种思路是都把钱兑换为最基础的Knut然后进行计算,同样负数处理要转换为绝对值。然后输出公式为:x/(17*29).x%(17*29)/29.x%29。这个公式想不过来可以用十进制的数举个例子。

注意点:负数结果的处理。

  • Code in C++
#include <iostream>

struct holy{
    long long Galleon;
    short Sickle;
    short Knut;
} input[2];

// 判断钱是否为0
bool isZero(holy &num) {
    if (num.Galleon == 0 && num.Sickle == 0 && num.Knut == 0) {
        return true;
    } else {
        return false;
    }
}

// lhs - rhs
holy sub(holy &lhs, holy &rhs) {
    if (isZero(rhs)) {
        return lhs;
    }
    if (isZero(lhs)) {
        lhs.Galleon = - rhs.Galleon;
        lhs.Sickle = - rhs.Sickle;
        lhs.Knut = - rhs.Knut;
        return lhs;
    }

    holy result;

    // Knut
    if (lhs.Knut >= rhs.Knut) {
        result.Knut = lhs.Knut - rhs.Knut;
    } else {
        result.Knut = lhs.Knut - rhs.Knut + 29;
        lhs.Sickle -= 1;
    }

    if (lhs.Sickle >= rhs.Sickle) {
        result.Sickle = lhs.Sickle - rhs.Sickle;
    } else {
        result.Sickle = lhs.Sickle - rhs.Sickle + 17;
        lhs.Galleon -= 1;
    }

    result.Galleon = lhs.Galleon - rhs.Galleon;

     // 负数处理
    if (result.Galleon < 0) {
        if (result.Knut != 0) {
            result.Knut = 29 - result.Knut;
            result.Sickle += 1;
        }

        if (result.Sickle != 0) {
            result.Sickle = 17 - result.Sickle;
            result.Galleon += 1;
        }
    }

    return result;
}

int main()
{
    char c;
    for (int i = 0; i < 2; ++i) {
        std::cin >> input[i].Galleon >> c >> input[i].Sickle >> c >> input[i].Knut;
    }

    holy result = sub(input[1], input[0]);
    std::cout << result.Galleon << c << result.Sickle << c << result.Knut << std::endl;

    return 0;
}


题目A1011 D进制的A+B

在这里插入图片描述

  • 题意
    计算转换进制后的结果是不是回文数字。单个数字是回文数字。

  • 思路
    这里就是简单的先转换进制,然后再判断是不是回文。只不过这里根据题目的数字范围,只能使用数组存储转换之后的结果。

注意点string基础char类型最大表示为127,所以不能使用string类型。

  • Code in C++
#include <iostream>

bool isPalindromic(int z[], int num) {
    for (int i = 0; i <= num / 2; ++i) {
        if (z[i] != z[num - 1 - i]) {
            return false;
        }
    }

    return true;
}

int main()
{
    int n, b, z[40], num = 0;
    scanf("%d%d", &n, &b);
    do {
        z[num++] = n % b;
        n /= b;
    } while (n != 0);
    bool flag = isPalindromic(z, num);
    if (flag == true) printf("Yes\n");
    else printf("No\n");
    for (int i = num - 1; i >= 0; i--) {
        printf("%d", z[i]);
        if (i != 0) printf(" ");
    }
    return 0;
}


小结

  1. 每次写函数的时候,需要先写对特殊情况的判断然后再写接下来的逻辑。
  2. 一些思路在特定情况下可行但是换一个情况就不可行了。(比如这里对于进制的求法是否可以使用string类型存储结果(最大数字表示127))

PS:庆幸自己从一而终的使用string类型来做转换发现它对数存储大小的限制问题,给自己了一个警醒。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值