数字三角形 (15 分)

代码长度限制 16 KB
时间限制 400 ms
内存限制 64 MB

题目描述

给出n,请输出一个直角边长度是n的数字直角三角形。所有数字都是 2 位组成的,如果没有 2 位则加上前导 0。

输入格式

输入为一个正整数n,1≤n≤100。

输出格式

输出为直角边长度是n的数字直角三角形,所有数字都是 2 位组成的,如果没有 2 位则加上前导 0,且当数字超过20时,重新从1开始。

输入样例

5

输出样例

1514100901
13110802
120703
0604
05

个人思路

  1. 先算出第一行第一个数字,这里要注意不能为0的情况
  2. 根据不大于20,不断减小的规则交替存入一个二维数组的每一行。这里是做第一步处理,方便后面直接输出
  3. 根据n的奇偶性逐列输出或逐行倒着输出
#include<bits/stdc++.h>
using namespace std;
int main()
{
    
    
    int n;
    cin>>n;
    int t=n*(n+1)/2%20;
    if(t==0)
        t=20;
    vector<vector<int>> vv;
    for(int i=0;i<n;i++)
    {
    
    
        vector<int> v;
        for(int j=0;j<=i;j++)
        {
    
    
            v.push_back(t);
            t--;
            if(t==0)
                t=20;
        }
        vv.push_back(v);
    }
    
    vector<vector<int>> vans;
    for(int i=0;i<n;i++)
    {
    
    
        vector<int> v;
        if(i%2==0)
            for(int j=0;j<vv[i].size();j++)
            {
    
    
                v.push_back(vv[i][j]);
            }
        else
        {
    
    
            for(int j=vv[i].size()-1;j>=0;j--)
            {
    
    
                v.push_back(vv[i][j]);
            }
        }
        vans.push_back(v);
    }
    
    for(int i=0;i<n;i++)
    {
    
    
            for(int j=0;j<vv[n-i-1].size();j++)
            {
    
    
                if(n%2==1)
                    printf("%02d",vans[i+j][j]);
                else
                    printf("%02d",vans[i+j][i]);
            }
        cout<<endl;
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_46050495/article/details/124108987