目录
1.题目描述:先要求你从键盘输入一个整数n(1<=n<=9),打印出指定的数字图形。
2.输入:输入包含多组测试数据。每组输入一个整数n(1<=n<=9)。
3.输出:对于每组输入,输出指定的数字图形。注意:每行最后一个数字后没有任何字符。
1.题目描述:先要求你从键盘输入一个整数n(1<=n<=9),打印出指定的数字图形。
2.输入:输入包含多组测试数据。每组输入一个整数n(1<=n<=9)。
3.输出:对于每组输入,输出指定的数字图形。
注意:每行最后一个数字后没有任何字符。
4.样例输入:5
5.样例输出:
1
121
12321
1234321
123454321
1234321
12321
121
1
6.思路
可以观察这个输出图形是一个上下左右都对称的图形。
第一版:按照左右对称输出,先输出左边,但是问题就是一旦上一行没有输出完,那么跳入下面的行的时候,如何让鼠标返回去是一个问题,所以这个想法行不通。
第二版:定义数组输出,整个二维数组填充最后一个又一个输出就行,但是问题就是:空格的地方需要有数据,那如果定义为字符串数组,中间的数字是有规律的,那数字输出来就很麻烦,定义为整形数组那空格没办法输出来,所以这个想法依旧不通过
第三版:按照上下对称输出,观察规律,很容易能看出n与输出行数i和列数j的关系,可以写出下列代码,但实际上,我并没有写出来,思路出来,去,看到这个答案的时候还是挺懵的,但是仔细观察加上在编译器里一步一步调试的时候就很清楚了。
ps:当你看不懂别人代码的时候,可以调试,一步一步下来之后就能明白了,加油!
7.代码展示:
#include<iostream>
#include<vector>
using namespace std;
void printTopPart(int n)//打印左半部分
{
for(int i=1;i<=n;i++)
{
//打印空格
for(int j=1;j<=n-i;++j)
{
cout<<" ";
}
//打印上半部分递增数据
for(int j=1;j<=i;j++)
{
cout<<j;
}
//打印上半部分递减数字
for(int j=i-1;j>=1;j--)
{
cout<<j;
}
cout<<endl;
}
}
void printBottomPart(int n)//同上只是换了方向
{
for(int i=n-1;i>=1;i--)
{
for(int j=1;j<=n-i;j++)
{
cout<<" ";
}
for(int j=1;j<=i;j++)
{
cout<<j;
}
for(int j=i-1;j>=1;j--)
{
cout<<j;
}
cout<<endl;
}
}
int main()
{
int n;
while(cin>>n)
{
if(n<1||n>9)
{
cout<<"输入数据错误"<<endl;
}
printTopPart(n);
printBottomPart(n);
}
}