题目大意:输入前一个时间和经过的分数数,输出当前时间。

s数组解释:将下列字符串转成一行,反斜杠转义,每行长度42,那么0就是0-2、42-45、84-86,其他字符以此类推。

._....._.._....._.._.._.._.._......__.....
|.|..|._|._||_||_.|_...||_||_|./\.|__||\/|
|_|..||_.._|..|._||_|..||_|._|/--\|...|..|

1、预处理数字
将每个数字的字符放到一个字符串里面,便于以后比较,b[i]存储第i个数据的字符串。(当然,直接跟s串比也行,不太舒服而已)

2、打印数字
输出时,每个数字3行,第一个数据在0-2,第二个数据在3-5,第三个数据在7-9……

3、时间加法
数据比较大,可以先模1440;分钟直接加,加完取模,取模前先进位;小时同理,但需要知道AM、PM转换,要看跨过多少次12,每跨过1次取反1次。

#include <bits/stdc++.h>
using namespace std;
int n, m, i, j, k, x, y, z, c;
int p[9] = {0, 3, 7, 10, 13, 17};
char s[199] = "._....._.._....._.._.._.._.._......__.....|.|..|._|._||_||_.|_...||_||_|./\\.|__||\\/||_|..||_.._|..|._||_|..||_|._|/--\\|...|..|";
char t[5][33], a[199], b[15][25];
int f(int p, int n, int m){//查找第p个数字,n是数字宽度,m是行长度
    char s[25]={0};
    int i, j, k=0;
    for(i=0; i<3; i++){
        for(j=0; j<n; j++){
            s[k++] = a[p+i*m+j];
        }
    }
    for(i=0; i<13; i++){
        if(strcmp(s, b[i]) == 0) return i;
    }
}
void yin(int c, int a){//将输出打印到t数组,c是第几个,a是值
    int i, j, k;
    if(a < 10) k = a * 3;
    else k = a * 3 + a - 10;
    for(i=0; i<3; i++){
        for(j=0; j<3+(a>=10); j++){
            t[i][p[c]+j] = s[k+j+i*42];
        }
    }
}
int main(){
    for(i=0; i<13; i++){
        if(i < 10) x = i * 3;
        else x = i*3 + i-10;
        for(j=m=0; j<3; j++){
            for(k=0; k<3+(i>=10); k++){
                b[i][m++] = s[x+j*42+k];
            }
        }
    }//b存储各字符的字符串
    for(i=0; i<3; i++) scanf("%s", a+i*21);
    x = f(0, 3, 21) * 10 + f(3, 3, 21);
    y = f(7, 3, 21) * 10 + f(10, 3, 21);
    z = f(13, 4, 21);//读入并预处理时间和APM
    for(i=m=0; i<3; i++){
        scanf("%s", a+i*m);
        if(!m) m = strlen(a);
    }
    for(i=c=0; i<m; i+=3) c = c*10 + f(i, 3, m);
    c %= 1440, y += c;//分钟
    k = x/12, x += y / 60, y %= 60;//小时、分钟
    z ^= x/12-k & 1;//多经过几次12,奇数AP要取反
    while(x > 12) x -= 12;
    yin(0, x/10), yin(1, x%10);
    yin(2, y/10), yin(3, y%10);
    yin(4, z), yin(5, 12);
    t[0][6] = '.', t[1][6] = t[2][6] = '*';
    for(i=0; i<3; i++) printf("%s\n", t[i]);
    return 0;
}