囧仙 的博客

囧仙 的博客

题解 【P7106双生独白】

posted on 2020-11-28 18:56:53 | under 题解 |

题目大意

  • 将一个保证合法的 $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!$ 练习题有得一拼(

参考代码

//三个数字的版本
#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;
}

//一个更加简短的版本
#include <stdio.h>
int main(){
    int a;scanf("%*c%6X",&a),printf("#%.6X\n",0xFFFFFF-a);
    return 0;
}