题目大意:输入前一个时间和经过的分数数,输出当前时间。
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; }