Asia区域制
题目链接:Asia区域制
题目描述
二进制数据是用 0 和 1 两个数码来表示的数.它的基数为 2 ,进位规则是“逢二进一”,借位规则是“借一当二”,由18世纪德国数理哲学大师莱布尼兹发现.
十六进制(简写为hex或下标 16 )在数学中是一种逢 16 进 1 的进位制.一般用数字 0 到 9 和字母 A 到 F(或 a ~ f )表示,其中: a ~ f 表示 10 ~ 15 ,这些称作十六进制数字.
请将给定的二进制数转为十六进制数,英文字母使用小写形式.

输入
第一行一个正整数 T, 代表有 T 组测试数据. (1≤T≤10).
接下来 T 行,每行输入一串只包含 0 和 1 的字符串(无前导 0),字符串长度:1≤length≤106.

输出
对于每组测试样例,输出转化后的十六进制数并单独占一行.

样例
input
2
1
10
output
1
2
题意分析
就是将输入的一个二进制数转换成十六进制,但是需要注意的是这里给的二进制的数很大很大,就算用unsigned long long也存不下,所以只能使用字符串处理了。二进制转换成十六进制可以每四位转换成一个十进制数,最后全部转化完的结果就是十六进制的表现形式。具体看代码实现
代码实现

#include<bits/stdc++.h>
using namespace std;
int main()
{
    string s;
    int n;
    cin>>n;
    while(n--)
    {
        cin>>s;
        stack<char> sta;
        stack<int> sta0;
        for(int i=0;i<s.size();i++)
        {
            sta.push(s[i]);
        }
        while(!sta.empty())
        {
            int flag=0,k=1,s=0;
            while(flag<4)
            {
                int m=sta.top()-'0';
                sta.pop();
                s+=m*k;
                k*=2;
                flag++;
                if(sta.empty())
                    break;
            }
            sta0.push(s);
        }
        while(!sta0.empty())
        {
            printf("%0x",sta0.top());
            sta0.pop();
        }
        cout<<endl;
    }
    return 0;

}

这里用到一个小技巧,c语言的printf的格式控制符里面有控制八进制(%o)十六进制(%0x)的控制符(具体更多的用法可以自行百度)可以直接使用。说到控制符就很气,请接着往下看。
我与这题的恩恩怨怨
校赛前还专门复习了一下进制转换,一开始没仔细看以为是道水题,直接WA了两发。看到数据范围才醒悟过来。
跟某大佬交流时听说python写这道题贼简单,正好我也在学习python,然后就试着用python写了这道题

for i in range(int(input())):
    print(hex(int(input(), 2))[2:])

毫无人性啊有没有😭python的大数。。。用python就有一种作弊的既视感。好好学习!!!