【图形】数字菱形
这是非信息类2013年出的题目,大家来看看,你会做吗?
输入 n 的值,输出如下例( n=4 )所示的数字菱形。
4
434
43234
4321234
43234
434
4
输入:
n
输出:
数字菱形
样例:
序号 | 测试输入 | 期待的输出 | 额外进程 |
---|---|---|---|
1 | 1↵ | 1↵ | 0 |
2 | 2↵ | 2 ↵ 2 1 2 ↵ 2 ↵ | 0 |
3 | 10↵ | 10↵ 109 10↵ 109 8 9 10↵ 109 8 7 8 9 10↵ 109 8 7 6 7 8 9 10↵ 109 8 7 6 5 6 7 8 9 10↵ 109 8 7 6 5 4 5 6 7 8 9 10↵ 109 8 7 6 5 4 3 4 5 6 7 8 9 10↵ 109 8 7 6 5 4 3 2 3 4 5 6 7 8 9 10↵ 109 8 7 6 5 4 3 2 1 2 3 4 5 6 7 8 9 10↵ 109 8 7 6 5 4 3 2 3 4 5 6 7 8 9 10↵ 109 8 7 6 5 4 3 4 5 6 7 8 9 10↵ 109 8 7 6 5 4 5 6 7 8 9 10↵ 109 8 7 6 5 6 7 8 9 10↵ 109 8 7 6 7 8 9 10↵ 109 8 7 8 9 10↵ 109 8 9 10↵ 109 10↵ 10↵ | 0 |
思路
我们首先能想到的就说上半部分再输入下半部分
观察规律就可以知道 i 行(1<=i<=n)的构成是
n-i组空格(注意是2个/组) + n递减到n-i+1 + n-i+2到n
当n+1<=i<=2n
n-j组空格(注意是2个/组) + n递减到n-j+1 + n-j+2到n ( j = 2n-i)
代码
#include <stdio.h>
int main( )
{
int i,j,n;
scanf("%d",&n);
for (i=1; i<=n; i++)
{
for(j=1;j<=n-i;j++)//先打印n-i组空格(注意是2个/组)
printf(" ");
for(j=n;j>n-i;j--)//打印n递减到n-i+1
printf("%-2d",j);
for(j=n-i+2;j<=n;j++)//再打印从n-i+2到n
printf("%-2d",j);
printf("\n");//一行打印完要换行
}
for (i=n-1; i>0; i--)
{
for(j=1;j<=n-i;j++)
printf(" ");
for(j=n;j>n-i;j--)
printf("%-2d",j);
for(j=n-i+2;j<=n;j++)
printf("%-2d",j);
printf("\n");
}
return 0;
}
课外思考
这看起来有些复杂,还能不能优化了呢
我们观察一下代码,发现两个外循环内的部分其实是一样的,只是计数器关于n对称而已
对称?同学们有没有想到绝对值?
代码
#include<stdio.h>
#define abs(x) ((x)>0?(x):-(x))
int main()
{
int n,i,j;
scanf("%d",&n);
n--;
for(i=-n;i<=n;i++)
{
for(j=0;j<abs(i);j++) printf(" ");
for(j=-(n-abs(i));j<=n-abs(i);j++)
printf("%-2d",abs(j)+abs(i)+1);
printf("\n");
}
return 0;
}