0
点赞
收藏
分享

微信扫一扫

等腰三角形数据探讨

眼君 2022-01-20 阅读 90


标题:等腰三角形

本题目要求你在控制台输出一个由数字组成的等腰三角形。
具体的步骤是:
1. 先用1,2,3,...的自然数拼一个足够长的串
2. 用这个串填充三角形的三条边。从上方顶点开始,逆时针填充。
比如,当三角形高度是8时:

       1
      2 1
     3   8
    4     1
   5       7
  6         1
 7           6
891011121314151

显示不正确时,参看:p1.png

输入,一个正整数n(3<n<300),表示三角形的高度
输出,用数字填充的等腰三角形。

为了便于测评,我们要求空格一律用"."代替。

例如:
输入:
5

程序应该输出:
....1
...2.1
..3...2
.4.....1
567891011

再例如:
输入:
10

程序应该输出:
.........1
........2.2
.......3...2
......4.....2
.....5.......1
....6.........2
...7...........0
..8.............2
.9...............9
1011121314151617181
 

再例如:
输入:
15

程序应该输出:

..............1
.............2.3
............3...2
...........4.....3
..........5.......1
.........6.........3
........7...........0
.......8.............3
......9...............9
.....1.................2
....0...................8
...1.....................2
..1.......................7
.1.........................2
21314151617181920212223242526


资源约定:
峰值内存消耗(含虚拟机) < 256M
CPU消耗  < 1000ms


请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。

注意:
main函数需要返回0;
只使用ANSI C/ANSI C++ 标准;
不要调用依赖于编译环境或操作系统的特殊函数。
所有依赖的函数必须明确地在源文件中 #include <xxx>
不能通过工程设置而省略常用头文件。

提交程序时,注意选择所期望的语言类型和编译器类型。

需要进行数据分析:

输入n代表数据总共n行,每一行的分析:

第一部分为“.”  

第二部分为“数据”

第三部分为“.”

第四部分为“数据”

第一行和最后一行稍微特殊,可以考虑合并或者单独处理。

分析可以看出第一部分的.和行号的关系为n-i(总共n行,i表示当前行数)

第二部分的数据为第一位置上的数(因为每一个数据可能是一位、二位或者三位数,所以只能考虑一个位置),需要将数据进行预处理,将多位数反向取数放到一个数组中,后续使用按位置取对应数据即可。

第三部分的.个数为(2*i-1)

第四部分的数据倒序取即可。

最后一个位置的数通过计算可以看出等于n-1+2n-1+n-2,即为4n-4位置的数据。

实验代码:

#include  <stdio.h>
int main()
{
    int i,j,k,n,tmp,temp[10000],l,a[10000],len=0;
    scanf("%d",&n);
    
    for(i=1;i<1200;i++){
        tmp=i;
        l=0;
        while(tmp>=1){
            temp[l]=tmp%10;
            tmp=tmp/10; 
            l++;
        }//取出每一位 
        for(int j=l-1;j>=0;j--){
            a[len]=temp[j];
            len++;
        }//当有很多位时,倒序
        if(len>=4*n-3)
            break;
    }
//    数据验证 
//    for(i=0;i<len;i++)
//    {
//        printf("%d ",a[i]);
//    }
    for(i=0;i<n-1;i++)
    {
    //    第一部分输出. 
        for(j=n-1;j>i;j--)
        {
            printf(".");
         } 
    //    第二部分输出数据
        printf("%d",a[i]);
         
    //    第三部分输出. 
        for(j=0;j<2*i-1;j++)
        {
            printf(".");
        }
    //    第四部分输出最后一位数据
        if(i!=0)
             printf("%d",a[4*n-4-i]);
     
        printf("\n"); 
    } 
    //最一行单独处理
    for(k=0;k<2*n-1;k++)
    {
        printf("%d",a[n+k-1]);
    }
    
}

欢迎留言探讨。 

举报

相关推荐

0 条评论