pta 又來一個上三角數字三角形
阿新 • • 發佈:2018-12-02
-- 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 又來一個上三角數字三角形