(复制出错,格式有问题。不要描述部分了,看输入样例就能理解题意)
输入格式
输入两个整数 k,n(1≤k≤10,0≤n≤99999999),分别表达放大的倍数和需要输出的数字。
输出格式
输出数码管显示的数字,数字每一位之间用一列空格隔开。
样例输入1
2 12345
样例输出1
-- -- -- | | | | | | | | | | | | -- -- -- -- | | | | | | | | | | -- -- --
样例输入2
3 67890
样例输出2
--- --- --- --- --- | | | | | | | | | | | | | | | | | | | | | | | | --- --- --- | | | | | | | | | | | | | | | | | | | | | | | | --- --- --- ---
#include <cstdio>
#include <string>
/*
* 刚开始看的时候一脸蒙,看着看着就看不下去了,断断续续看了一天才看懂。看懂后感觉其实也没那么难。坚持看,不断思考,迟早会懂的。
* 结合题目,思考自己的解决思路,如果思路跟代码算法一样的话,有助于理解代码。理解够了,实践能力迟早能跟上。
* */
int num[10][5] = {//用于判断,输出0-9的形状
{1, 3, 0, 3, 1},
{0, 1, 0, 1, 0},
{1, 1, 1, 2, 1},
{1, 1, 1, 1, 1},
{0, 3, 1, 1, 0},
{1, 2, 1, 1, 1},
{1, 2, 1, 3, 1},
{1, 1, 0, 1, 0},
{1, 3, 1, 3, 1},
{1, 3, 1, 1, 1}
};
using namespace std;
void print(int n, int k, int layer) {//8 2 0
if(layer % 2 == 0) {//通过观察发现,当倍数为1时,第0,2,4行只有" "和"-"。
printf(" ");
for(int i = 0;i < k;++ i) {//横向放大
if(num[n][layer]) {
printf("-");
} else {
printf(" ");
}
}
printf(" ");
} else {//3=2+1,矩阵中的3是这样来的,7也行,随你喜欢。一个3就可以判断出当前数字该行的两端应该输出什么,非常精妙的设计,看了好久才看懂。
if(num[n][layer] & 2) printf("|");
else printf(" ");
for(int i = 0;i < k;++ i) {//横向放大
printf(" ");
}
if(num[n][layer] & 1) printf("|");
else printf(" ");
}
}
int main() {
int k, n, len = 0;
int num[10];
scanf("%d%d", &k, &n);
if(n == 0) num[len ++] = 0;
else while(n) {//分解数字
num[len ++] = n % 10;//压入栈
n /= 10;
}
for(int layer = 0;layer < 5;++ layer) {
if(layer % 2 == 1) {
for(int j = 1;j < k;++ j) {//垂直方向放大
for(int i = len - 1;i >= 0;-- i) {
print(num[i], k, layer);
if(i) printf(" ");//分隔两个数字
}
printf("\n");//换行输出
}
}
for(int i = len - 1;i >= 0;-- i) {
print(num[i], k, layer);//因为是栈,要倒着取
if(i) printf(" ");//分隔两个数字
}
printf("\n");//换层输出
}
return 0;
}