数字图形
发布时间: 2018年3月20日 21:24 最后更新: 2018年3月20日 23:08 时间限制: 1000ms 内存限制: 128M
描述
很多人都喜欢“8”这个数字,这道题的要求就是输出以某个字母为基础像素点的图形“8”。
输入
输入有多组数据,每组数据中有一个字符c和一个整数n,字符表示基础像素点(均为大写字母),整数n(5<=n<=100)表示高度。
输出
横线总是一个字符粗,也就是说只有一行,中间字符长度为(n/2-1),如样例1,第一行中间为两个A,即7/2-1=2。
竖线随着总高度每增长6而增加1个字符宽。当总高度从5增加到6时,其竖线宽度从1增长到2。下圈高度不小于上圈高度,但应尽量接近上圈高度,且下圈的内径呈正方形。
样例输入1
A 7
样例输出1
AA AA AA AA AA AA AA AA AA AA AA
样例输入2
B 8
样例输出2
BBB BB BB BB BB BBB BB BB BB BB BB BB BBB
提示
每行最后一个字母后无空格。
————————————————————————————————————————————————————
以上为题目原答案,说实话,看到这个题的时候还是有点懵逼的,想到可能要重复循环输出字母+空格+字母。但又苦于自己太笨,规律找不好,没有很好的做完。
以下为AC代码
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
int main()
{
int i,j,k;
char a;
int n;
while(scanf("%c%d",&a,&n)!=EOF)
{
getchar();//接收回车
int a1=n/6+1;//竖线字符宽的增加
int u1=(n-3)/2;//
int d1=n-3-(n-3)/2;//内径
//printf("fkdjkla\n"); 测试
for(i=1;i<=a1;i++)
{
printf(" ");
}
for(i=1;i<=d1;i++)
{
printf("%c",a);
}
printf("\n");//从此往上为第一行
for(j=1;j<=u1;j++)
{
for(i=1;i<=a1;i++)
{
printf("%c",a);
}
for(i=1;i<=d1;i++)
printf(" ");
for(i=1;i<=a1;i++)
{
printf("%c",a);
}
printf("\n");
}
//printf("\n");
for(i=1;i<=a1;i++)
{
printf(" ");
}
for(i=1;i<=d1;i++)
{
printf("%c",a);
}
printf("\n");
for(j=1;j<=d1;j++)
{
for(i=1;i<=a1;i++)
{
printf("%c",a);
}
for(i=1;i<=d1;i++)
printf(" ");
for(i=1;i<=a1;i++)
{
printf("%c",a);
}
printf("\n");
}
for(i=1;i<=a1;i++)
{
printf(" ");
}
for(i=1;i<=d1;i++)
{
printf("%c",a);
}
printf("\n");
}
return 0;
}
解决问题的关键在于内外径以及列宽,感觉这样一行一行的输出结果就可以了,但是看到标程才发现自己写的真的是又臭又长......以下为标程:
#include<cstdio>
#define pfn printf("\n")
char c[2];//开始就定义字母
int n;
void pr(int flag)//定义一个函数,可以重复使用封装
{
for(int t=0;t<2;t++)
{
int i,j;
for(i=0;i<n/6+1;i++)//n/6+1 为竖排字符宽度
printf(" ");
for(i=0;i<n/2-1;i++)//n/2-1 横排长度
printf("%c",c[0]);
pfn;
for(i=(flag==0&&t==1?-1:0);i<(n%2?n/2-1:n/2-2);i++)//这一行是简化代码的关键 如果是偶数行高 那么讲
{
for(j=0;j<n/6+1;j++)
printf("%c",c[0]);
for(j=0;j<n/2-1;j++)
printf(" ");
for(j=0;j<n/6+1;j++)
printf("%c",c[0]);//printf("%d",t);
pfn;
}
}
}
int main()
{
//freopen("data.in","r",stdin);
//freopen("data.out","w",stdout);
while(scanf("%s%d",c,&n)!=EOF)
{
pr(n%2);//判断奇数还是偶数
int i,j;
for(i=0;i<n/6+1;i++)//输出最后一行
printf(" ");
for(i=0;i<n/2-1;i++)
printf("%c",c[0]);
pfn;
}
return 0;
}