题解 【P7106双生独白】
囧仙
2020-11-28 18:56:53
## 题目大意
- 将一个保证合法的 $16$ 进制大写颜色代码串反转后输出。
## 题解
虽然题面上似乎要转换成 $10$ 进制、做减法后输出,但很幸运的是,式样化输入/输出函数(也就是 $\verb!printf!$ 和 $\verb!scanf!$ )标准中提供了一些很好用的东西。
- 标识符 $\verb!X!$ 可以输入/输出一个**大写十六进制串**。(注:用 $\verb!x!$ 可以输入/输出小写十六进制串)
- 在 $\verb!scanf!$ 中使用形如 $\verb!%2X!$ 的格式可以输入一个长度为 $2$ 的内容。
- 在 $\verb!scanf!$ 中使用形如 $\verb!%*c!$ 的格式可以过滤掉一个字符。
- 在 $\verb!printf!$ 中使用形如 $\verb!%.2X!$ 的格式可以输出长度为 $2$ **并且包含前导零**的内容。
如果你知道了上述内容,然后组合一下,这题的答案就呼之欲出了。
---
当然,如果你自己观察这题的细节的话,你会发现输入 $3$ 个 $16$ 进制数进行翻转,和输入一个十六进制数翻转后输出结果相同(
这里再补习一个知识点:
- 在 $\text{c++}$ 中,你能用形如 $\verb!0xFFFFFF!$ 的形式表示一个 $16$ 进制常量。
那么最终代码就能进一步压缩(
$\frak{u1s1}$ ,这题和 $\verb!scanf&printf!$ 练习题有得一拼(
## 参考代码
```cpp
//三个数字的版本
#include<bits/stdc++.h>
using namespace std;
int a,b,c;
int main(){
scanf("%*c%2X%2X%2X",&a,&b,&c);
printf("#%.2X%.2X%.2X\n",255-a,255-b,255-c);
return 0;
}
```
---
```cpp
//一个更加简短的版本
#include <stdio.h>
int main(){
int a;scanf("%*c%6X",&a),printf("#%.6X\n",0xFFFFFF-a);
return 0;
}
```