藍橋杯日常刷題——練習1097:蛇行矩陣

題目描述

蛇形矩陣是由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+i=1n(i1)

而行的規律

1 1+2 1+2+3 1+2+3+4 ...
2 2+3 2+3+4 

設行首數據爲a0 寫成公式i=1n(a0+i1)

題目代碼

#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語言網

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章