P8115「RdOI R3.5」Table 题解

· · 题解

先读入字符并将它们转化为十进制数,压入一个 std::vector,然后一个一个弹出来处理(将它们转化为十六进制数,判断哪一个占字符位比较多)即可。

求十进制数的位数可以使用 cmath 中的 log10() 函数。

模拟题注意读入和输出时的细节。读入时可以使用 cctype 中的 isdigit() 函数来判断是否是数字,输出时注意输出 16 进制数时的格式。

放代码:

// 本题的坑点:使用该方法 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;
}