河南2023CCPC Problem G. Toxel 与字符画

        一天,Toxel 找到了一个形如 x^y 的数学表达式,其中 x 和 y 都是正整数。他希望以 “自我包含” 的 方式将这个表达式绘制成字符画。

        具体来说,Toxel 首先将计算出 x^y 的结果等于 z。若 z ≤ 10^18,Toxel 将把 x y = z 绘制出来;否则, 他将绘制 x^y = INF。Toxel 将在一个 10 × m 像素的画布上绘制表达式。非指数部分的数字,以及 =INF 这四个符号每个占据 7 × 7 像素的位置,且其顶端与画布顶端距离为 2。指数部分的数字每个占据 5 × 5 像素的位置,且其顶端与画布顶端距离为 1。每个数字或符号所包含的像素均填入本字符,其余空白像素 则填入 . 字符。数字和符号的具体形态请参见末尾的提示部分。任意两个符号之间应间隔恰好一列空白 像素,且左右两端也应留出恰一列空白像素。需要注意的是,字符 1 也需要占满 7 × 7(非上标)或 5 × 5 (上标)像素。请参阅样例以更好地理解题意。

        Toxel 最近忙于给河南省赛命题,因此没有时间自己来绘制字符画了。请你帮他完成这个任务。

输入格式 

本. 题. 包. 含. 多. 组. 数. 据。.

第一行包含一个整数 T(1 ≤ T ≤ 100),表示数据组数。

对于每组数据: 一行包含一个字符串,格式为 x^{y}。其中 x, y 为正整数,且满足 1 ≤ x, y ≤ 10^18。

字符串中不包 含任何其它字符。

 输出格式 

对于每组数据: 首先输出 10 行 10 个字符串,表示字符画。再输出一行空白行,以便分割各组数据。

先用数组存起来x,y和x^y的值,然后截取字符串输出(注意是一行一行打印的),重点在于判断x^y<1e18

#include<iostream>
#include<string>
#include<cstring>
#include<cmath>
using namespace std;
typedef unsigned long long ll;
const ll MM = 1e18;
int arr[20], brr[20], crr[20];
int cnta = 0, cntb = 0, cntc = 0;
string bnum[10] = { ".................................................................................",
".................................................................................",
".0000000.......1.2222222.3333333.4.....4.5555555.6666666.7777777.8888888.9999999.",
".0.....0.......1.......2.......3.4.....4.5.......6.............7.8.....8.9.....9.",
".0.....0.......1.......2.......3.4.....4.5.......6.............7.8.....8.9.....9.",
".0.....0.......1.2222222.3333333.4444444.5555555.6666666.......7.8888888.9999999.",
".0.....0.......1.2.............3.......4.......5.6.....6.......7.8.....8.......9.",
".0.....0.......1.2.............3.......4.......5.6.....6.......7.8.....8.......9.",
".0000000.......1.2222222.3333333.......4.5555555.6666666.......7.8888888.9999999.",
"................................................................................." };
string snum[10] = { ".............................................................",
".00000.....1.22222.33333.4...4.55555.66666.77777.88888.99999.",
".0...0.....1.....2.....3.4...4.5.....6.........7.8...8.9...9.",
".0...0.....1.22222.33333.44444.55555.66666.....7.88888.99999.",
".0...0.....1.2.........3.....4.....5.6...6.....7.8...8.....9.",
".00000.....1.22222.33333.....4.55555.66666.....7.88888.99999.",
".............................................................",
".............................................................",
".............................................................",
"............................................................." };
string fh[10] = { ".................................",
".................................",
".........IIIIIII.N.....N.FFFFFFF.",
"............I....NN....N.F.......",
".=======....I....N.N...N.F.......",
"............I....N..N..N.FFFFFFF.",
".=======....I....N...N.N.F.......",
"............I....N....NN.F.......",
".........IIIIIII.N.....N.F.......",
"................................." };

ll power(ll x, ll n,bool&flag) {
    ll res = 1;
    if (x == 1) return 1;
    for (int i = 0; i < n; i++)
    {
        res *= x;
        if (res > MM) {
            flag = true;
            return res;
        }
    }
    return res;
}
void solve() {
    ll a, b;
    memset(arr, 0, sizeof arr);
    memset(brr, 0, sizeof brr);
    memset(crr, 0, sizeof crr);
    cnta = cntb = cntc = 0;
    int n;
    char ch;
    cin >> a >> ch >> ch >> b >> ch;
    bool flag = false;
    ll po = power(a, b,flag);
    ll aa = a, bb = b, cc = po;
    while (aa) {
        n = aa % 10;
        arr[cnta++] = n;
        aa /= 10;
    }
    while (bb) {
        n = bb % 10;
        brr[cntb++] = n;
        bb /= 10;
    }
    if (!flag) {
        while (cc) {
            n = cc % 10;
            crr[cntc++] = n;
            cc /= 10;
        }
    }
    if (flag) {
        for (int j = 0; j < 10; j++) {
            for (int i = 0; i < cnta + cntb + 1; i++) {
                if (i < cnta) {
                    cout << bnum[j].substr(arr[cnta - i - 1] * 8, 8);
                }
                else if (i >= cnta && i < cntb + cnta) {
                    cout << snum[j].substr(brr[cntb - (i - cnta) - 1] * 6, 6);
                }
                else {
                    cout << fh[j];
                }
            }cout << endl;
        }
    }
    else {
        for (int j = 0; j < 10; j++) {
            for (int i = 0; i < cnta + cntb + 1 + cntc; i++) {
                if (i < cnta) {
                    cout << bnum[j].substr(arr[cnta - i - 1] * 8, 8);
                }
                else if (i >= cnta && i < cnta + cntb) {
                    cout << snum[j].substr(brr[cntb - (i - cnta) - 1] * 6, 6);
                }
                else if (i == cnta + cntb) {
                    cout << fh[j].substr(0, 8);
                }
                else {
                    cout << bnum[j].substr(crr[cntc - (i - cnta - cntb)] * 8, 8);
                }
            }cout << '.' << endl;
        }
    }
    cout << endl;
}
int main() {
    int T;
    cin >> T;
    while (T--) {
        solve();
    }
}
  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

0x3fffff

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值