P8115「RdOI R3.5」Table 题解
先读入字符并将它们转化为十进制数,压入一个 std::vector,然后一个一个弹出来处理(将它们转化为十六进制数,判断哪一个占字符位比较多)即可。
求十进制数的位数可以使用 cmath 中的 log10() 函数。
模拟题注意读入和输出时的细节。读入时可以使用 cctype 中的 isdigit() 函数来判断是否是数字,输出时注意输出
放代码:
// 本题的坑点:使用该方法 unsigned long long 要开,不然会 RE 或 WA
#include<bits/stdc++.h>
using namespace std;
int main(){
char c; bool f=false;
vector<unsigned long long> v;
while(c=getchar()){
if(isdigit(c)){
unsigned long long x=c-48;
while(c=getchar()){
if(isdigit(c))x=x*10+c-48;
else if(c=='}'){f=true; break;}
else break;
}
v.emplace_back(x);
}
if(f||c=='}')break;
} // 读入处理
putchar('{');
for(int i=0;i<v.size();i++){
if(!v[i])putchar(48);
else{
unsigned long long d=v[i]; vector<int> v2;
while(v[i])v2.emplace_back(v[i]&15),v[i]>>=4;
if(v2.size()+2>(int)log10(d)+1)printf("%lld",d); // 判断长短
else{
printf("0x");
for(int j=v2.size()-1;j>=0;j--){
if(v2[j]>9)printf("%c",v2[j]+55);
else printf("%d",v2[j]);
} // 输出十六进制数
}
}
if(i!=v.size()-1)putchar(','); // 按格式输出逗号
}
putchar('}');
return 0;
}