图形题-打印三角形

打印如下数字三角形 
输入:起始数字,行数
输出:对应数字三角形
(数字递增,若超过9,则从0开始)

例如,输入3 6,则输出:

345678

7     9

6   0

5 1

42

3

测试输入期待的输出时间限制内存限制额外进程
测试用例 3以文本方式显示
  1. 3 6↵
以文本方式显示
  1. 345678↵
  2. 7   9↵
  3. 6  0↵
  4. 5 1↵
  5. 42↵
  6. 3↵
1秒64M0
测试用例 4以文本方式显示
  1. 7 4↵
以文本方式显示
  1. 7890↵
  2. 5 1↵
  3. 42↵
  4. 3↵
1秒64M0

 思路:

    这道题的难点在于,我们依照按行打印的思路,虽然不难找到第一行、其后每行第二个数字以及空格的规律,但却难以找到其后每行第一个数字和行数之间的规律。

    这时我们可以看看能否采用“拆分”观察的方法来找规律。要求的图形最后一行的数字和行数之间的规律我们能找到,图形最后一行的的数字和第二行至倒数第二行的第一个数字之间的规律我们也能找到,它也和行数有关。这样的话,我们只需先推出最后一行的数字(btm),再用它来推我们难以直接求的第二行至倒数第二行的第一个数字(frt)就好了。

    还有一个细节,我们在这道题中,推任何一个数字时,都要一次次地自增1,因为说不准什么时候它就会增大到9以上。修复这个bug的过程启示我测试用例最好设个很大的,再设个很小的。

#include <stdio.h>  
  
int main(){  
    int arr[10]={0,1,2,3,4,5,6,7,8,9};  
    int bgn=0,hang=0;  
    scanf("%d %d",&bgn,&hang);  
    for (int i = 0; i < hang; ++i)  
    {  
        printf("%d",arr[bgn]);  
        bgn++;  
        if(bgn>9)  
        {  
            bgn=0;  
        }  
    }  
    printf("\n");  
  
    int btm=bgn-2;  
    for (int i = 0; i < hang; ++i)  
    {  
        btm+=1;  
        if(btm>9)  
        {  
            btm=0;  
        }  
    }  
  
    for (int hangNow = 2; hangNow <= hang ; ++hangNow)  
    {  
        if(hangNow!=hang)  
        {  
            int frt=btm;  
            for (int i = 0; i < hang-hangNow; ++i)  
            {  
                frt++;  
                if(frt>9)  
                {  
                    frt=0;  
                }  
            }  
            printf("%d",arr[frt]);  
            for (int j = 0; j < hang-1-hangNow; ++j)  
            {  
                printf(" ");  
            }  
        }  
        printf("%d\n",arr[bgn]);  
        bgn++;  
        if(bgn>9)  
        {  
            bgn=0;  
        }  
    }  
}  

  • 17
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值