題目描述
蛇形矩陣是由1開始的自然數依次排列成的一個矩陣上三角形。
輸入
本題有多組數據,每組數據由一個正整數N組成。(N不大於100)
輸出
對於每一組數據,輸出一個N行的蛇形矩陣。兩組輸出之間不要額外的空行。矩陣三角中同一行的數字用一個空格分開。行尾不要多餘的空格。
樣例輸入
5
樣例輸出
1 3 6 10 15
2 5 9 14
4 8 13
7 12
11
題目分析
解法一:
如果,我們只從數學規律角度去分析這道題,應該把這道問題分成行和列來分別計算
列的規律
1
1+1
1+1+2
1+1+2+3
...
我們可以寫成公式
而行的規律
1 1+2 1+2+3 1+2+3+4 ...
2 2+3 2+3+4
設行首數據爲 寫成公式
題目代碼
#include<cstdio>
using namespace std;
int main()
{
int b;
while(~scanf("%d",&b))
{
int a = 1,m=1,n=2,s=0;
for(int j = 0;j<b;j++){
m+=j;
printf("%d ",m);
for(int k = n ;k<=b;k++){
s=s+k;
printf("%d",m+s);
if(k!=b) printf(" ");
}
s=0;
n++;
printf("\n");
}
}
return 0;
}
解法二:
其實也不難發現,我們如果將第一行的數據存儲一下,或許還可以使算法更高效
我們發現以下規律
a[0] a[1] a[2] ...
a[1]-1 a[2]-1 a[3]-1 ...
...
題目代碼
#include<cstdio>
using namespace std;
const int Max_N = 100;
int main()
{
int a[Max_N],n;
while(~scanf("%d",&n))
{
for(int i = 0;i<n;i++)
{
a[i] = (i+1)*(i+2)/2;
}
for(int j = 0;j<n;j++)
{
for(int k = j;k<n;k++)
{
printf("%d",a[k]);
if(k!=n-1) printf(" ");
else printf("\n");
a[k] = a[k]-1;
}
}
}
return 0;
}
原題鏈接:C語言網