题解 【P7106双生独白】

囧仙

2020-11-28 18:56:53

Personal

## 题目大意 - 将一个保证合法的 $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; } ```