代码长度限制 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
个人思路
- 先算出第一行第一个数字,这里要注意不能为0的情况
- 根据不大于20,不断减小的规则交替存入一个二维数组的每一行。这里是做第一步处理,方便后面直接输出
- 根据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;
}
}