【图形】数字菱形

输入 n 的值,输出如下例( n=4 )所示的数字菱形。
  4 
 434 
 43234 
4321234 
 43234 
 434 
  4 
输入: 
    n

输出:
   数字菱形

友情提示:同学们总结一下打印星号组成的实心图形程序的编程思路:第一步,打印星号组成的正方形;第二步,改变每行星号的个数,打印每行星号数量不一样的图形;如果是空心图形,每行第一个和最后一个位置输出星号,其他位置输出空格。

现在我们练习输出变化的字符,在打印星号图形的基础上,原来输出*号的位置,将printf("*");改为printf("%2d",x);当然,原来输出一个*号的地方只占一个字符的位置,现在都要改为2个字符的位置,如果输出的是数字且多于2个,则要是%3d或%4d了。

x是多少呢?则要寻找其规律,就是该输出位置与所在行列的关系。

注意给出的测试用例,输出的数字是左对齐啊。不用数组就可以完成。

测试输入期待的输出时间限制内存限制额外进程
测试用例 1以文本方式显示
  1. 1↵
以文本方式显示
  1. 1 ↵
1秒64M0
测试用例 2以文本方式显示
  1. 2↵
以文本方式显示
  1.   2 ↵
  2. 2 1 2 ↵
  3.   2 ↵
1秒64M0
测试用例 3以文本方式显示
  1. 3↵
以文本方式显示
  1.     3 ↵
  2.   3 2 3 ↵
  3. 3 2 1 2 3 ↵
  4.   3 2 3 ↵
  5.     3 ↵
1秒64M0
测试用例 4以文本方式显示
  1. 8↵
以文本方式显示
  1.               8 ↵
  2.             8 7 8 ↵
  3.           8 7 6 7 8 ↵
  4.         8 7 6 5 6 7 8 ↵
  5.       8 7 6 5 4 5 6 7 8 ↵
  6.     8 7 6 5 4 3 4 5 6 7 8 ↵
  7.   8 7 6 5 4 3 2 3 4 5 6 7 8 ↵
  8. 8 7 6 5 4 3 2 1 2 3 4 5 6 7 8 ↵
  9.   8 7 6 5 4 3 2 3 4 5 6 7 8 ↵
  10.     8 7 6 5 4 3 4 5 6 7 8 ↵
  11.       8 7 6 5 4 5 6 7 8 ↵
  12.         8 7 6 5 6 7 8 ↵
  13.           8 7 6 7 8 ↵
  14.             8 7 8 ↵
  15.               8 ↵
1秒64M0
测试用例 5以文本方式显示
  1. 10↵
以文本方式显示
  1.                   10↵
  2.                 109 10↵
  3.               109 8 9 10↵
  4.             109 8 7 8 9 10↵
  5.           109 8 7 6 7 8 9 10↵
  6.         109 8 7 6 5 6 7 8 9 10↵
  7.       109 8 7 6 5 4 5 6 7 8 9 10↵
  8.     109 8 7 6 5 4 3 4 5 6 7 8 9 10↵
  9.   109 8 7 6 5 4 3 2 3 4 5 6 7 8 9 10↵
  10. 109 8 7 6 5 4 3 2 1 2 3 4 5 6 7 8 9 10↵
  11.   109 8 7 6 5 4 3 2 3 4 5 6 7 8 9 10↵
  12.     109 8 7 6 5 4 3 4 5 6 7 8 9 10↵
  13.       109 8 7 6 5 4 5 6 7 8 9 10↵
  14.         109 8 7 6 5 6 7 8 9 10↵
  15.           109 8 7 6 7 8 9 10↵
  16.             109 8 7 8 9 10↵
  17.               109 8 9 10↵
  18.                 109 10↵
  19.                   10↵
1秒64M0

思路:

    本题图形是关于第n行对称的,我们可以先写第1到n行的循环。显然先要打印n-hang个空格,然后从输入的整数n开始进行【打印-自减1】循环hang-1次,再【打印-自增1】循环hang次。

    因为输入的整数n对图形很重要,是不能再次改动的,所以我们引入过程量p=n,在操作过程中通过改变p来获得要求的图形。记得在每行打印完后让p恢复到n。

    第n行以后的图形,观察可知每行空格数量变为hang-n,循环次数只需把第一自然段写的hang替换为2倍的n-hang(求>n的hang,关于n对称的那个<n的hang是多少)即可。

#include <stdio.h>

int main(){
    int n=0;
    scanf("%d",&n);
    int p=n;
    for (int hang = 1; hang <= 2*n-1; ++hang)
    {
        if(hang<=n)
        {
            for (int i = 0; i < n-hang; ++i)
            {
                printf("  ");
            }
            for (int i = 0; i < hang-1; ++i)
            {
                if(p>=10)
                {
                    printf("%d",p);
                }
                else
                {
                    printf("%d ",p);
                }
                p--;
            }
            for (int i = 0; i < hang; ++i)
            {
                if(p>=10)
                {
                    printf("%d",p);
                }
                else
                {
                    printf("%d ",p);
                }
                p++;
            }
            p=n;
            printf("\n");
        }
        else if(hang>n)
        {
            for (int i = 0; i < hang-n; ++i)
            {
                printf("  ");
            }
            for (int i = 0; i < 2*n-hang-1; ++i)
            {
                if(p>=10)
                {
                    printf("%d",p);
                }
                else
                {
                    printf("%d ",p);
                }
                p--;
            }
            for (int i = 0; i < 2*n-hang; ++i)
            {
                if(p>=10)
                {
                    printf("%d",p);
                }
                else
                {
                    printf("%d ",p);
                }
                p++;
            }
            p=n;
            printf("\n");
        }
    }
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值