說明:1.本問題來源於《C語言經典、趣味、實用程序設計編程百例精解》,所有程序為本人自己編寫。與原程序不同之處作有標記。
2.本系列所有程序均使用codeblocks編譯,操作系統為Windows XP。
問題:在屏幕上顯示楊輝三角
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
………………………………
分析:我以圖形的特點出發,設計兩個數組,循環輸出,代碼如下。
#include <stdio.h> #include <stdlib.h> int main(void) { int i=0, j=0; int a[20]={0}, b[20]={0}; a[0]=1; int rows=1; printf("Please input rows: "); scanf("%d", &rows); //控制輸出多少行 for(i=1; i<=rows; i++) { for(j=0; j<rows-i; j++) //控制輸出每行前的空格 { printf(" "); } for(j=0; j<rows; j++)//將數組a復制給數組b { b[j] = a[j]; } for(j=1; j<=i-1; j++) //通過數組b給下一行賦值 { a[j] = b[j-1] + b[j]; } for(j=0; j<rows; j++) //輸出新一行數組a { if(a[j]!=0) printf("%4d", a[j]); } printf("\n"); } return 0; }
輸出情況如下:
圖1
原書分析如下:
楊輝三角中的數,正是(x+y)的N次冪展開式的各項的系數。從楊輝三角的特點出發,可以總結出:
1)第N行有N+1個值(設起始行為0行);
2)對於第N行的第J個值:(N>=2);
當J=1時或J=N+1時:其值為1;
J!=1且J!=N+1時:其值為第N-1行的第J-1個值和第J個值的和。
將如上特點提煉成數學公式可表示為:
1 x=1或x=N+1
c(x,y)=c(x-1,y-1)+c(x-1,y)
#include <stdio.h> #include <stdlib.h> int YangHui(int x,int y); int main(void) { int i, j, n=13; printf("N="); while(n>12) scanf("%d", &n); //控制輸入正確的值以保證屏幕顯示的圖形正確 for(i=0; i<=n; i++) //控制輸出N行 { for(j=0; j<24-2*i; j++) printf(" "); //控制輸出第i行前的空格 for(j=1; j<i+2; j++) printf("%4d", YangHui(i, j)); //輸出第i行的第j個值 printf("\n"); } return 0; } int YangHui(int x, int y) { int z; if((y==1)||(y==x+1)) return 1; z=YangHui(x-1,y-1)+YangHui(x-1, y); return z; }
輸出情況如下:
圖2