Luogu8115 solution
Problem
link->https://www.luogu.com.cn/problem/P8115
Solution
这题一看就是个模拟,我们可以考虑使用秦九韶算法在读入字符时计算每一个数字 \(x\) 的十进制,然后遇见非数字字符就清空 \(x\),再考虑需要输出十进制还是十六进制。
Code
#include<bits/stdc++.h>
#define int __int128 //十年 OI 一场空,不开 __int128 见祖宗
using namespace std;
char f(int x) { //看看 x 在十六进制中代表什么
if(x<10)
return x+'0';
else
return 'A'+x-10;
}
string Solve(int x) {
string dec="",hex="";
int t=x;
do //十进制
dec+=t%10+'0';
while(t/=10);
reverse(dec.begin(),dec.end()); //需要翻转string Solve(int x) {
do //十六进制
hex+=f(x%16);
while(x/=16);
reverse(hex.begin(),hex.end()); //需要翻转
hex="0x"+hex; //加前缀 "0x"
return hex.size()<=dec.size()? hex:dec; //十六进制小于等于十进制就选择十六进制
}
signed main() {
char c=getchar(),l;
int x=0;
while(true) {
if(isdigit(c)) //秦九韶算法,如果为数字,就塞在 x 的末尾继续计算
x=x*10+c-'0';
else {
if(c=='{') // '{' 开头输出
putchar(c);
else if(c==',') //为 ',' 就清空 x 并输出 x 和 ','
cout<<Solve(x),putchar(c),x=0;
else {
if(l!='{') //注意空数组情况
cout<<Solve(x);
putchar(c); break; // '}' 退出
}
}
l=c;
c=getchar(); //继续读入
}
return 1;
}
除此之外,我们还有一种更装逼优秀的解法。
我们发现输入格式比较固定,基本上就是:
若干字符+一个整数+若干字符+一个整数+……+一个整数+若干字符。
其实,我们可以忽略字符,只读数字。看看快读模板:
void read(int &x) {
x=0;
char c=getchar();
while(!isdigit(c)) c=getchar();
while(isdigit(c)) { x=(x<<3)+(x<<1)+(c&15); c=getchar(); }
return;
}
思考一下,第一个 while 的作用是什么呢?是的,就是过滤非数字字符!
我们可以设计这么一个算法:
- 输出
{; - 读入 \(x\);
- 计算使用十进制还是十六进制,并输出对应进制的 \(x\);
- 重复 \(2\)、\(3\) 两步,直至读入
}; - 输出
}。
当然,细节还需管控,如逗号的输出、空数组的处理等等。
Code
#include<bits/stdc++.h>
#define int __int128
using namespace std;
int read(int &x) {
int flag=0; x=0;
char c=getchar();
while(!isdigit(c)) { flag|=c=='}'; c=getchar(); if(flag) return -1; }
while(isdigit(c)) { x=(x<<3)+(x<<1)+(c&15); c=getchar(); flag|=c=='}'; }
return !flag;
}
char f(int x) {
if(x<10)
return x+'0';
else
return 'A'+x-10;
}
string Solve(int x) {
string a="",b="";
int t=x;
do a+=t%10+'0'; while(t/=10);
do b+=f(x%16); while(x/=16);
reverse(a.begin(),a.end());
reverse(b.begin(),b.end()); b="0x"+b;
return b.size()<=a.size()? b:a;
}
signed main() {
putchar('{');
int x=-1,flag=0,ed=1;
while(ed) {
ed=read(x);
if(ed==-1)
break;
if(!flag) flag=1; else putchar(',');
cout<<Solve(x);
}
putchar('}');
return 0;
}

浙公网安备 33010602011771号