[code] PTA 胡凡算法笔记 DAY012

本文通过三个实例,详细讲解了进制转换和数学运算在编程中的应用,包括RGB颜色值的进制转换、货币单位换算以及整数格式化输出的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意A1027 Colors in Mars

在这里插入图片描述

  • 题意
    将输入的10进制RGB值转换为13进制,并按格式输出。

  • 思路
    解析题目本质就是一个进制转换的题目,因为十三进制超过10的部分会输出字母,所以这里需要设置一个数组作为映射,然后就是求R,G,B分别对应的十三进制数是多少。我的代码部分需要区分个位和不是个位的情况。然后输出的时候每两位的前后要倒着输出。
    但是下面简洁版的code就不用,很nice~

  • Code in C++

  1. 简洁code 😙
#include <cstdio>

char table[13] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C'};
int main()
{
    int r, g, b;
    scanf("%d%d%d", &r, &g, &b);
    printf("#");
    printf("%c%c", table[r / 13], table[r % 13]);
    printf("%c%c", table[g / 13], table[g % 13]);
    printf("%c%c", table[b / 13], table[b % 13]);

    return 0;
}
  1. My code 😢
#include <iostream>

char table[13] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C'};

int main()
{
    int color;
    int result[6] = {0};

    int count = 0;
    for (int i = 0; i < 3; ++i) {
        std::cin >> color;
        if (color < 13) {
            result[count++] = color % 13;
            result[count++] = 0;
            continue;
        }
        do {
            result[count++] = color % 13;
            color /= 13;
        } while (color != 0);
    }
    std::cout << '#';
    for (int i = 0; i < 3; ++i) {
        for (int j = 1; j >= 0; --j) {
            std::cout << table[result[i*2+j]];
        }
    }
    return 0;
}

题意A1058 A+B in Hogwarts

在这里插入图片描述

  • 题意
    Galleon = 17Sickle,Sickle = 29 Knut,按规则求A+B的结果并按格式输出。

  • 思路
    我这里是全部都转换为以Knut为单位求和为K,然后按 K / (17*29) 个Galleon(K% (17*29) ) / 29 个SickleK % 29 个Knut输出。

  • Code in C++

#include <iostream>

#define Galleon (17*29)
#define Sickle 29

struct currency {
    long long galleon;
    int sickle;
    int knut;
} A, B;

int main()
{
    char c;
    std::cin >> A.galleon >> c >> A.sickle >> c >> A.knut;
    std::cin >> B.galleon >> c >> B.sickle >> c >> B.knut;
    long long tmpA = A.galleon * Galleon + A.sickle * Sickle + A.knut;
    long long tmpB = B.galleon * Galleon + B.sickle * Sickle + B.knut;
    long long result = tmpA + tmpB;
    std::cout << result / Galleon << c << (result % Galleon) / Sickle << c << result % Sickle;
    return 0;
}


题意B1006 换个格式输出整数

在这里插入图片描述

  • 题意
  1. 多少个百就输出多少个B
  2. 多少个十就输出多少个S
  3. 个位数就从1开始输出到这个数字为止
  • 思路
    就是简单的分隔出百,十,个位数字大小,然后按对应规律输出字符即可。

  • Code in C++

#include <cstdio>

int main()
{
    int n;
    scanf("%d", &n);

    int b = n / 100;
    int s = (n %100) / 10;
    int g = n %10;

    for(int i = 0; i < b; ++i) {
        printf("%c", 'B');
    }
    for(int i = 0; i < s; ++i) {
        printf("%c", 'S');
    }
    for (int i = 1; i <= g; ++i) {
        printf("%c", '0' + i);
    }

    return 0;
}

小结

  1. 数学问题的时候,要首先想一下数学简洁的表示方式。比如这里对于百位,十位,个位的求法。不管进制怎么变,公式都是一样的。 百位:k / base^2,十位:(k % base^2) / base,个位:k % base
  2. 对于题意的理解,我现在发现好几次是我不太能get到题目说的意思,这里最后一题不知道是case给的太巧了还是啥,每个都是最后几位就是n,导致我以为是个位就输出1,然后个位对应多少输出多少就好了。😢 【这里安利一下leetcode,可以自己设置case,然后看题目的输出还是挺棒的,可以辅助理解题目的意思,不过啥都是双刃剑,这里有可能过于依赖都不自己去思考直接用case去看题意了】。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值