1. 程式人生 > >pta 又來一個上三角數字三角形

pta 又來一個上三角數字三角形

-- tdi 題目 字符位置 for ret 位置 ace 代碼

一道簡單題,可是,因為格式錯誤的原因,我居然花了半個小時的時間!

題目:

輸入一個正整數n,輸出具有n層的上三角數字三角形。

輸入格式:

只有一個正整數n,1<=n<=100。

輸出格式:

一個上三角數字三角形,每個數字占四個字符位置。

輸入樣例:

5

輸出樣例:

1 6 10 13 15

2 7 11 14

3 8 12

4 9

5

一開始我的代碼是這個樣子的:

#include <stdio.h>
int main()
{
int n,i,j,k=1,a[100][100]={0};
scanf("%d",&n);

for(i=0;i<n;i++) { int s=n; for(j=0;j<n-i;j++) { if(j==0) { a[i][0]=k; k++; } if(j>0) { a[i][j]=a[i][j-1]+s+1; } s--; } } for(i=0;i<n;i++) { for(j=0;j<n-i;j++) { if(j==(n-i-1)){ printf("%d",a[i][j]); } else { if(a[i][j]>9) { printf("%d ",a[i][j]); } else if(a[i][j]>99
) { printf("%d ",a[i][j]); } else if(a[i][j]>999) { printf("%d",a[i][j]); } else { printf("%d ",a[i][j]); } } } printf("\n"); } return 0; }

通過仔細閱讀題目可以知道,空格出現在數字之前,但是我初步做的是在數字之後,格式錯誤,而且這樣分類容易少列舉出現的情況,也會造成資源的浪費。

所以,改良了代碼:

int main()
{
    int n,i,j,k=1,a[200][200]={0};
    scanf("%d",&n);

    
for(i=0;i<n;i++) { int s=n; for(j=0;j<n-i;j++) { if(j==0) { a[i][0]=k; k++; } if(j>0) { a[i][j]=a[i][j-1]+s+1; } s--; } } for(i=0;i<n;i++) { for(j=0;j<n-i;j++) { printf("%4d",a[i][j]); } printf("\n"); } return 0; }

題目上說的是“每個數字占四個字符位置”,所以可以直接這樣輸出:

 printf("%4d",a[i][j]);  

用了C++的方法做,進一步簡化:

#include <iostream>
#include <cstdio>
using namespace std;

int a[105][105];

int main(){
    int n;
    scanf("%d", &n);
    int sum = 0;
    for (int i = 1 ; i <= n ; i++){
        for (int j = 1 ; j <= n + 1 - i ; j++){
            sum++;
            a[j][i] = sum; 
        }
    }
    
    for (int i = 1 ; i <= n ; i++){
        for (int j = 1 ; j <= n + 1 - i ; j++){
            printf("%4d",a[i][j]);
        }
        printf("\n");
    }
    return 0;
}

這兩個AC了的代碼,主要區別是,前者是按行輸出,後者是按列輸出,這道題目,按列輸出會更方便簡單。

這是這次的做題心得。

pta 又來一個上三角數字三角形