题意A1027 Colors in Mars
-
题意
将输入的10进制RGB值转换为13进制,并按格式输出。 -
思路
解析题目本质就是一个进制转换的题目,因为十三进制超过10
的部分会输出字母,所以这里需要设置一个数组作为映射,然后就是求R,G,B
分别对应的十三进制数是多少。我的代码部分需要区分个位和不是个位的情况。然后输出的时候每两位的前后要倒着输出。
但是下面简洁版的code就不用,很nice~ -
Code in C++
- 简洁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;
}
- 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 个Sickle
,K % 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 换个格式输出整数
- 题意
- 多少个百就输出多少个B
- 多少个十就输出多少个S
- 个位数就从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;
}
小结
- 数学问题的时候,要首先想一下数学简洁的表示方式。比如这里对于百位,十位,个位的求法。不管进制怎么变,公式都是一样的。 百位:
k / base^2
,十位:(k % base^2) / base
,个位:k % base
。 - 对于题意的理解,我现在发现好几次是我不太能get到题目说的意思,这里最后一题不知道是case给的太巧了还是啥,每个都是最后几位就是n,导致我以为是个位就输出1,然后个位对应多少输出多少就好了。😢 【这里安利一下
leetcode
,可以自己设置case,然后看题目的输出还是挺棒的,可以辅助理解题目的意思,不过啥都是双刃剑,这里有可能过于依赖都不自己去思考直接用case去看题意了】。