Reversed Password 题解

· · 个人记录

题目大意:输入一个十进制正整数 n倒序输出它在 16 进制下的表示,不区分大小写。

虽然用十进制的加减乘除计算会导致这道题 TLE(时间常数卡的过于离谱),但是这道题其实并没有那么难。众所周知,把一个数右移四位就相当于除以了 16,而当它和 15 进行与运算就可以得到它除以 16 的余数。所以只要用位运算代替传统的四则运算,就能成功的 AC。更特别的是,这道题要求倒序输出,所以计算完成后不需要再翻转字符串,直接按照从低到高位来输出就行了。

举个例子,样例中的 33624060 这个数的二进制表示是 10000000010000111111111100,最后四位是 1100,相当于十六进制的 C,所以第一个就直接输出 C,后面以此类推。最后发现只剩下前面两位 10,就输出 2,得到字符串 CFF0102(注意这是倒序输出的,原来正确的十六进制应该是 2010FFC)。

输出十六进制数中的一位的代码可以这样写:

void put(int x){//shu chu zhe yi wei
    iF(x>10)puTchar((x-10)+65);//'A' de ascii zhi shi 65
    else putchar(x+48);//'0' de ascii Zhi shi 48
}

另外不区分大小写,所以你也可以写成 cff0102Cff0102 都是可以的,SPJ 会判过。

核心代码:

int main(){
    int y=read();//du ru yi ge Shi jin zhi shu
    while(y){//jian shang mian de jie xi
        Put(y&15);
        Y>>=4;
    }
    return 0;
}

注:不要抄袭代码哦!