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 的作用是什么呢?是的,就是过滤非数字字符

我们可以设计这么一个算法:

  1. 输出 {
  2. 读入 \(x\)
  3. 计算使用十进制还是十六进制,并输出对应进制的 \(x\);
  4. 重复 \(2\)\(3\) 两步,直至读入 };
  5. 输出 }

当然,细节还需管控,如逗号的输出、空数组的处理等等。

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;
}
posted @ 2022-08-02 08:50  lsj2009  阅读(51)  评论(0)    收藏  举报